rabbitMQ 队列过多导致性能问题解决思路
最近在使用 事件驱动(eventdrive)的方式架构一个新的实验项目,发现在这样的方式下逻辑稍微复杂会需要创建不少的 queue,几乎是每一个消息都需要新增一个queue,AMQP协议本身 是exchange对应queue,消费者消费queue,而queue的数量过多会直接影响 rabbit 本身的性能,rabbit本身不能帮我们解决这样的问题,因此我们需要自己从设计方面来解决这个问题。
第一种方式:
一个队列接受多种类似的消息,message header存放定的关键字段,监听方通过message header 关键字段进行不同的逻辑分支处理。
第二种方式:
这种方式其实还是第一种的设计优化后的处理方式:我们都知道netty 的性能非常好,这与它的设计模式分不开:selector轮询和reactor的设计模式,这里不详细展开,读者可自行查阅相关问题。
这里我们可以借鉴netty的设计,把一个 listener endpoint 当做一个selector,listener endpoint 只负责监听队列的消息,然后将消息交由单独的线程根据关心字段信息处理分类,然后再交由对应的Handel线程池处理。这样的处理方式相对第一种会有更好的扩展性和直观的性能。