限流场景下,生产者的速度>消费者的速度,如果我们按照ribbitMq的默认配置,能达到限速的效果么,答案是否定的
不禁就产生了以下几个疑问:
问题1:默认场景下rabbitMQ的消费方式是推还是拉呢?
问题2:需要哪些配置rabbitMQ才能实现限速效果呢?
问题3:消费端是单线程消费还是多线程消费呢,如何进行控制?
问题4:其他消息中间件又如何来实现的呢?
问题5:哪些场景适合推模式,哪些场景适合拉模式呢?
带着这些疑问,展开对rabbitMq的进一步的学习
问题1:默认场景下rabbitMQ的消费方式是推还是拉呢?
参考:
了解到rabbitMq提供了push和pull两种实现方式:
1、push模式
基于DeliverCallback 回调函数,示例代码如下:
DeliverCallback deliverCallback = (consumerTag, delivery) -> { String message = new String(delivery.getBody(), "UTF-8"); System.out.println(" [x] Received '" + message + "'"); }; channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
2、pull模式
pull模式主要是通过channel,basicGet方法来获取消息,示例代码如下:
GetResponse response = channel.basicGet(QUEUE_NAME, false); System.out.println(new String(response.getBody())); channel.basicAck(response.getEnvelope().getDeliveryTag(),false);
问题2:需要哪些配置rabbitMQ才能实现限速效果呢?
参考资料:
push模式
1、设置customer的ack模式为手动ack。
channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
2、将手动ack的确认在业务完成以后
3、队列模型的当未ack数据达到一定数量时,会阻断后续消息得消费,达到限流得效果
pull模式
不手动拉取消息,那么消息就会堆积到消息中间件,也能达到限速的效果
问题3:消费端是单线程消费还是多线程消费呢,如何增加消费端得处理能力?
参考文献: