首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

一个简单的业务场景,不知如何实现

  •  
  •   lanqing · 252 天前 · 1463 次点击
    这是一个创建于 252 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务描述

    • 有很多 client 与服务器 socket 通信
    • 有一个 redis 队列存了特定 client 需要的信息
    • client 发送请求连接给服务器,服务器在 redis 中找到这个 client 需要的信息(如果没有一直等待),找到后返回给这个 client,结束.

    我原本的想法

    • 服务器是 socketserver 多线程,当有个 client 来的时候,就循环在 redis 中找,一直到找到后再发送给 client

    弊端

    • 我想了下,如果我有 10000 个 client,会出现两个问题:
      • 10000 个 client 一直与我的服务器连接中(会不会服务器不支持这个多的连接同时存在)
      • 10000 个 client 每一个都要循环去 redis 中找数据 相同的操作重复了 10000 次,好蠢
      • 其实只要有一个循环一直查 redis,查到参数,就发给 client 与服务器连接的那个 socket 就可以(不知道如果实现这一步的想法)

    希望大佬能指点一二呀= =,

    18 回复  |  直到 2018-11-07 11:45:06 +08:00
        1
    gaius   252 天前
    循环查 redis 是什么意思?
        2
    lanqing   252 天前
    @gaius 因为 redis 中的数据是动态加入进去的,当那个 socket 没有查到他想要的数据的时候,就会过个两秒钟接着去 redis 中查数据,一直到查到为止
        3
    xiaoxinshiwo   252 天前
    redis 不是有发布和订阅机制吗?
    再不然使用消息中间件,订阅 topic 然后监听接收消息啊
        4
    changnet   252 天前 via Android
    redis 是 kv 结构,为啥是循环查找而不是按 key 取
    10000 个 socket 连接是支持的

    说实在,不知道具体业务。不知道 client 是面对用户还是内部接口,不知道请求频率,不知道数据结构,这种问题发出来也没什么人帮得了你
        5
    newtype0092   252 天前
    你只是想实现一个队列消息加服务端推送吧。。。
        6
    ipoh   252 天前
    不用多线程的模型,用异步的方式
    服务器这边维护一个{clientID->socket 句柄}的哈希表
    然后启一个线程去循环查 redis 每个元素,元素的在上面哈希表中就用对应的 socket 句柄发送过去
        7
    richzhu   252 天前
    0.0 客户端知道自己想要什么吧? 客户端想要的称之为 Key, 然后服务端可以根据 Key 去 redis 取? 取到的值叫 value ? 酱紫。。不需要循环吧?
        8
    niubee1   252 天前
    我倒是很想知道什么样的人会设计 redis 用循环的方式读取数据, 莫不是来搞笑的
        9
    lauix   252 天前
    你这样是 client 主动拉取,为什么不主动推送。
    不想自己写,可以用现成的 比如 MQTT 协议,ZMQ , T-IO 等开业项目。
        10
    lanqing   252 天前
    @xiaoxinshiwo 非常感谢,发布和订阅机制能帮助我
        11
    knightlhs   252 天前
    10000 个 cient 也不过是 10000 个 list 而已
    每个 client 去查找自己的 list 找到数据就返回 找不到就阻塞 直到 超时就好啊
    你只要根据数据不同 分发到不同的 list 去就可以了

    你这个 redis 没学好啊 redis 支持那么多种用法跟结构啊
        12
    Outliver0   252 天前
    epoll
        13
    lanqing   252 天前
    @lauix 感谢,对,可以理解是 client 主动拉取,但是不还是需要 client 主动过来建立链接,然后才能发送过去吗= =
        14
    lanqing   252 天前
    @ipoh 可以,我愚笨了,感谢!
        15
    lauix   252 天前
    @lanqing 打错字了,是开源。
    client 当然要连接 server 端了,但是 client 只接收消息,server 端 有数据的时候,主动发送到 client。
    和其他人说的 发布订阅一个道理 。可以自己写,可以采用其他开源的项目。
        16
    lanqing   252 天前
    @lauix 好的,谢谢
        17
    lanqing   252 天前
    @richzhu 如果没有就是要循环去查了哦= =,
        18
    knightlhs   252 天前
    @lanqing redis 如果需要循环查找的话一定是你的使用方式哪里错了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3794 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 08:45 · PVG 16:45 · LAX 01:45 · JFK 04:45
    ♥ Do have faith in what you're doing.