V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ne6rd
V2EX  ›  问与答

请教一个并发处理的逻辑。

  •  
  •   ne6rd · 2022-09-05 16:38:33 +08:00 · 927 次点击
    这是一个创建于 598 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有 10 个 IP 资源, 有 10 个固定数量的 worker , 有 1 个先进先出的 queue ,在 13:59 分左右,大约 n ( 1-100 )个 job 进入队列,同时 worker 开始消费队列。 在每个 job 里,要取得一个 IP ,进行一些请求,大约持续 1-600 秒。请问如何保证在同一时间,每个 worker 在使用 unique 的 IP ?

    第 1 条附言  ·  2022-09-05 18:25:33 +08:00
    好像找到了一个简单的实现,用 reids 的 set 提前存储所有可用 IP 。
    在 job 的开始,spop 一个 ip ,如果拿到了就继续,如果没拿到就等待 1s ,再次尝试。
    在 job 结束的时候再把 ip sadd 回去。
    7 条回复    2022-09-05 18:42:31 +08:00
    ne6rd
        1
    ne6rd  
    OP
       2022-09-05 16:40:14 +08:00
    还有这种问题有没有什么关键词可以 google ,尝试一些搜出来都是无关的。
    libook
        2
    libook  
       2022-09-05 16:44:01 +08:00
    你只有 10 个 IP 资源,又要求同一时间只能有一个 worker 用同一个 IP ,那同一时间就最多只能有 10 个 worker 在请求。
    你可以搞个 IP 池,每个 worker 要发起请求前限去池子里获取一个 IP ,没有就等待;池子每发出一个 IP 就把这个 IP 设为不可再次发放,直到 worker 告诉它释放资源; worker 获取到 IP 就发送请求(你也可以在每个 worker 做个请求队列),发送完请求就告诉池子释放这个 IP ,然后继续处理接下来的任务。

    这个 IP 池你可以自己写个服务,也可以用 Redis 之类的进行管理。
    ne6rd
        3
    ne6rd  
    OP
       2022-09-05 16:52:29 +08:00
    @libook 请问用 redis 实现相比数据库比如 postgres 有啥优势吗?除了快之外,redis 有啥特殊机制能方便实现这种资源的分配和释放吗?
    libook
        4
    libook  
       2022-09-05 16:58:32 +08:00
    @ne6rd #3 我是感觉,你只有 10 个 IP 需要管理的话,怎么方便怎么来,如果以前在用 Redis 就顺便用,没有 Redis 也不值得为了这个单独架一个,除非没有比开个 Redis 更简单省事的方法了。
    比如你本来没有 Redis ,但你有 PG ,也可以考虑在 PG 里开个表来管理这 10 个 IP ,没啥问题。

    Redis 的优势主要是内存存储比较快,比如你有 1000 万个 IP 要维护,那可能比 PG 效率要高一些。
    Lax
        5
    Lax  
       2022-09-05 17:22:34 +08:00
    10 个 IP-10 个 worker ,为什么不直接一一对应?
    ne6rd
        6
    ne6rd  
    OP
       2022-09-05 17:39:41 +08:00
    @Lax 没办法控制 worker 的逻辑? worker 是一个底层组件,IP 是业务逻辑,只能通过 job 携带业务数据。
    qeqv
        7
    qeqv  
       2022-09-05 18:42:31 +08:00
    @ne6rd worker 应该可以把配置参数传给 job 吧,一一对应 IP ,然后 job 里面直接用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5454 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:05 · PVG 17:05 · LAX 02:05 · JFK 05:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.