一个简单的业务场景,不知如何实现 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
lanqing
V2EX    Python

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

  •  
  •   lanqing 2018-11-07 10:17:40 +08:00 3051 次点击
    这是一个创建于 2561 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务描述

    • 有很多 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
    gaius
        1
    gaius  
       2018-11-07 10:20:53 +08:00
    循环查 redis 是什么意思?
    lanqing
        2
    lanqing  
    OP
       2018-11-07 10:22:05 +08:00
    @gaius 因为 redis 中的数据是动态加入进去的,当那个 socket 没有查到他想要的数据的时候,就会过个两秒钟接着去 redis 中查数据,一直到查到为止
    xiaoxinshiwo
        3
    xiaoxinsiwo  
       2018-11-07 10:34:40 +08:00
    redis 不是有发布和订阅机制吗?
    再不然使用消息中间件,订阅 topic 然后监听接收消息啊
    changnet
        4
    changnet  
       2018-11-07 10:36:18 +08:00 via Android
    redis 是 kv 结构,为啥是循环查找而不是按 key 取
    10000 个 socket 连接是支持的

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

    你这个 redis 没学好啊 redis 支持那么多种用法跟结构啊
    Outliver0
        12
    Outliver0  
       2018-11-07 10:44:29 +08:00
    epoll
    lanqing
        13
    lanqing  
    OP
       2018-11-07 10:45:59 +08:00
    @lauix 感谢,对,可以理解是 client 主动拉取,但是不还是需要 client 主动过来建立链接,然后才能发送过去吗= =
    lanqing
        14
    lanqing  
    OP
       2018-11-07 10:48:50 +08:00
    @ipoh 可以,我愚笨了,感谢!
    lauix
        15
    lauix  
       2018-11-07 10:51:38 +08:00
    @lanqing 打错字了,是开源。
    client 当然要连接 server 端了,但是 client 只接收消息,server 端 有数据的时候,主动发送到 client。
    和其他人说的 发布订阅一个道理 。可以自己写,可以采用其他开源的项目。
    lanqing
        16
    lanqing  
    OP
       2018-11-07 10:52:41 +08:00
    @lauix 好的,谢谢
    lanqing
        17
    lanqing  
    OP
       2018-11-07 11:01:47 +08:00
    @richzhu 如果没有就是要循环去查了哦= =,
    knightlhs
        18
    knightlhs  
       2018-11-07 11:45:06 +08:00
    @lanqing redis 如果需要循环查找的话一定是你的使用方式哪里错了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5230 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 07:13 PVG 15:13 LAX 23:13 JFK 02:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86