1. 解耦:#
一个模块A接受前端请求,收到请求之后需要调用另一个模块B,以完成后续事项。一开始需要B做完之后,才回包给前端,这是第一种流程,这种流程很明显会很依赖模块B的运作情况。 但是如果业务允许,我们还可以有第二种流程: 模块A不用等模块B把事情做完,只用将信息传递到一个中转站,B从中转站感知到这件事,再自己去做就可以了,这个中转站,就是消息队列,可以起到解耦的作用。
2. 异步:#
用户很难通过同步接口长时间等待结果,那就应该做成异步,先扔进消息队列,后续再进行消费,和解耦一样可以收获更高的性能,以及获得更好的可靠性。
3. 消息分发:#
信息更新场景,比如某个用户信息更新了,而B、C、D三个模块都需要缓存这个信息,那么用户信息更新之后就可以发一条信息到消息队列,B、C、D只要订阅了相关主题,就都可以收到这条信息。
4. 削峰:#
架构和异步相同,将请求放入队列中,慢慢消费 模块A不用一次性把消息打给B,而是只用将信息传递到一个中转站,B按自身的消费能力从中转站拉取消息,再自己去做就可以了,这个中转站,就是消息队列,可以起到削峰的作用。
选型思路
- 我们团队主要对性能和可靠性有要求
- 性能要有5000 QPS,这里Kafka和RocketMQ都远远够用
- 可靠性要有多副本机制,这点Kafka和RocketMQ也都OK
- 其他功能则不是我们选择的核心要点
- 所以最后考虑到Kafka是我们团队已经成熟使用的技术栈,最终还是选择了Kafka。
