知识卡片
单队列进程的吞吐上限靠分片突破
内容
RabbitMQ里每个队列背后对应一个独立的Erlang处理进程,这个进程本身有处理能力上限,当发送速率超过这个上限时,Connection和Channel都会被限流而队列进程本身却”跑满”。解决办法不是优化单个队列进程的实现,而是把一个逻辑队列拆成多个物理队列(比如4个),生产者按某种规则(如消息序号取模)把消息分散写入这些物理队列,对上层业务通过一层封装隐藏这个拆分细节,使其感觉不到背后有多个队列。发散:这是分片(sharding)思路在消息队列场景的直接应用——当单个处理单元的吞吐到达物理上限时,横向复制处理单元比继续优化单个处理单元的常数因子更有效,代价是需要额外处理”分片间消息顺序性”这类新问题。
参考来源
《RabbitMQ实战指南》第9章《RabbitMQ高阶》