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

2022-09-05 16:38:33 +08:00
 ne6rd

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

938 次点击
所在节点    问与答
7 条回复
ne6rd
2022-09-05 16:40:14 +08:00
还有这种问题有没有什么关键词可以 google ,尝试一些搜出来都是无关的。
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
2022-09-05 16:52:29 +08:00
@libook 请问用 redis 实现相比数据库比如 postgres 有啥优势吗?除了快之外,redis 有啥特殊机制能方便实现这种资源的分配和释放吗?
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
2022-09-05 17:22:34 +08:00
10 个 IP-10 个 worker ,为什么不直接一一对应?
ne6rd
2022-09-05 17:39:41 +08:00
@Lax 没办法控制 worker 的逻辑? worker 是一个底层组件,IP 是业务逻辑,只能通过 job 携带业务数据。
qeqv
2022-09-05 18:42:31 +08:00
@ne6rd worker 应该可以把配置参数传给 job 吧,一一对应 IP ,然后 job 里面直接用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/877853

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX