在并发情况下, 允许多个消费者消费同一个消息队列, 并保证消息被消费的基本语义(Kafka的模式). 通过消费者之间对消息进行收取竞争, 来保证整体负载的平衡.
问题
分布式环境下的程序往往对下层的服务有大量的需求. 由于网络的不稳定性等, 我们往往希望底层的服务能够分布在不同的机器上, 同时去响应需求并异步返回结果.
在真实引用中, 往往业务需求和时间有很大的关系. 如每年双11, 双12, 大量的请求会涌入电商服务. 每天晚上10点到12点, 对于欧洲足球联赛的需求会挤压底层服务等等. 我们需要对能够接受的请求, 进行削峰填谷. 避免大量请求和链接淹没整个底层基础架构
解决
这个设计模式是Kafka使用的, 内部就不再累述了, 可以直接阅读Kafka的设计文档
问题
消息顺序 队列是否需要维护进来的消息的先后顺序, 是一个需要权衡的点. 像Kafka并不保证全局消息的顺序性, 带来的是更高的吞吐
弹性服务 是否需要在线横向扩容, 是否支持故障节点的重启和fail-over
检查有毒信息 在经典的拜占庭将军问题中, 有一个概念是poison message, 部分将军可能是判断节点. 队列系统是否需要识别这些有害的信息, 并把它们自动剔除掉是一个权衡点.
结果处理 很多分布式队列系统, 支持一个基本概念是future, 异步的把处理结果返回到消息的发送方. 这是一个需要注意的点.
消息可靠性 在分布式队列系统里, 需要保证消息不会丢失, 可靠性的设计是需要考虑的