之前没用过消息队列,背景是这样的:
生产者分发题目到多个消费者,消费者计算出结果再汇总。这个业务量应该很大,百万级别吧。
分发需要消息队列吗?目前看中了 nsq,因为程序是 go 语言开发,nsq 有一个负载均衡的功能;
汇总需要消息队列吗?其实汇总就是为了方便统计结果,目前的思路是写到一个数据库,每个机器打包多条结果发送到消息队列再由数据库所在服务器进行写入,或者直接写入?有什么更好的方法吗?
另外需要上微服务吗?目前只考虑计算 A 结果,后续可能会有 B 结果 C 结果,上微服务有利于扩展吗?
老大要我给出中间件到调研结果。。。
1
xyqhkr 2019-04-29 17:05:38 +08:00
nsq 支持的客户端较少。貌似现在也不怎么更新了。。kafaka 比较多吧
|
2
wind3110991 2019-04-29 17:13:20 +08:00
( 1 )百万级别不算多,你的场景加好锁就行了;
( 2 )多个消费者直接从消费者取,不用分发; ( 3 )一定要用消息队列的话,建议用 kafka,单独开一个 topic ; ( 4 )计算结果结束后,如果结果之间存在关联关系,需要再次写入队列计算,这里用消息队列和 queue 都可以; 不要介意,总感觉你这个需求感觉说的不清不楚,有点为了用消息队列和为了用微服务而用的感觉。 |
4
EthanDon OP @wind3110991 感谢回复,的确是这样的。我还是个 noob,微服务和消息队列之前都没接触过,既然被委任调研中间件就思考了一下怎么去用,怎么可能用得上。。
( 2 ) 这个怎么直接取呢?利用 redis 吗? ( 3 ) kafka 可以支持多个生产者一个消费者吗? ( 4 )应该是没有关联的。其实计算结果是一些指标,比如 url 能不能访问,延迟多少之类的。 |
5
wind3110991 2019-04-29 17:30:19 +08:00
( 2 )一个进程取所有题目回来,开 N 个子线程直接消费;
( 3 )可以,https://www.jianshu.com/p/6233d5341dfe ( 4 )那你可以多个消费线程计算后直接刷新数据库; 你其实要理解的是,消息队列就是个管道,主要是为了解耦系统模块与模块之间的高耦合,降低相互之间的依赖,防止一个部分挂了后,整个系统都 GG ; |
6
EthanDon OP @wind3110991 嗯嗯谢谢
( 4 )里面还有一个问题是消费者是部署在多个机房甚至是跨网络的,直接访问数据库可能不太方便(这里我也不是很明白什么意思,当初老大给我讲让消费者直接读数据库可能不太好,但是我想再昂贵的操作也不过就是 http 了吧。。。) |
7
LeoQ 2019-04-29 19:31:56 +08:00 via iPhone
感觉像监控系统 hhh
|
8
9hills 2019-04-29 19:37:12 +08:00 via iPhone
kafka 你这个需求都可以。
其实 redis 5.0 刚刚也支持 queue 了,你可以用这个,简单 |
9
opengps 2019-04-29 20:03:04 +08:00
量将来会更大,消息队列就很有必要了
汇总部分已经做了打包,写入不密集,可以考虑下直接写入数据库,不过多了个数据库挂掉丢数据的问题 至于微服务,我不太懂没啥可说的 |
10
wind3110991 2019-04-29 20:30:23 +08:00
@EthanDon 你这个就是分布式理论 CAP 中的 C (一致性),在延时不一致的消费情况下,如何在 C 和 A 之间做平衡和取舍。这个看你们对数据的要求,如果是诸如报表之类的展示分析型数据,可以适度舍弃可用性,保证一致性即可。但是如果是关键数据,涉及计费和关键业务的,要保证数据是高可用的。
|
11
fishioon 2019-04-29 20:31:28 +08:00 via iPhone
redis 5.0 的 stream 考虑一下?
|
12
version 2019-04-29 20:42:02 +08:00
用阿里云的消息队列咯.蛮多的.而且还有 http 这样方便很多
自己搭不靠谱.没经验维护不好.掉包出错重发怎么处理..百万级当练手.不可能吧. |
13
yippees 2019-04-29 21:31:52 +08:00
干嘛不直接数据库计算好了··
百万级别 数据库也不至于撑不住吧 |
14
kimown 2019-04-29 21:41:29 +08:00 via Android
redis 完美解决
|
15
petelin 2019-04-29 21:45:26 +08:00 via iPhone
百万级汇总直接扔
Es 得了一点不用操心 |
16
troywinter 2019-04-29 22:47:56 +08:00
你需要的不是消息队列,你需要的是 streaming system,参考 flink, spark, storm,这事是典型的 map reduce
|
17
wc951 2019-04-30 08:26:05 +08:00 via Android
这个不是典型的流式计算吗,消息队列在这里面只是作为数据源而已
|
18
lwb 2019-04-30 10:47:34 +08:00
学习下
|