rabbitmq基本原理:
https://blog.csdn.net/yingfeng612/article/details/80150592
安装过程:
https://blog.csdn.net/u010046908/article/details/54773323
https://blog.csdn.net/u010442302/article/details/73189152
添加用户:
https://blog.csdn.net/kk185800961/article/details/55214474
学习流程:
https://blog.csdn.net/lmj623565791/article/details/37607165
知识点总结:
0.是否开启自动应答:
boolean ack = false ; //打开应答机制
channel.basicConsume(QUEUE_NAME, ack, consumer);
//另外需要在每次处理完成一个消息后,手动发送一次应答。
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
1.队列持久化的声明:boolean durable = true;
这样,当RabbitMQ退出或者异常退出,我们将不会丢失所有的队列和信息。
RabbitMQ不允许使用不同的参数重新定义一个队列,所以已经存在的队列,我们无法修改其属性。
如果不设置持久化,那么重启rabbitmq之后,消息队列将全部丢失。
2.分发消息的方式round-robin:
RabbitMQ会一个一个的发送信息给下一个消费者(consumer),而不考虑每个任务的时长等等,且是一次性分配,并非一个一个分配。平均的每个消费者将会获得相等数量的消息。
3.公平转发(Fair dispatch):
目前的消息转发机制(Round-robin)并非是我们想要的。例如,这样一种情况,对于两个消费者,有一系列的任务,奇数任务特别耗时,而偶数任务却很轻松,这样造成一个消费者一直繁忙,另一个消费者却很快执行完任务后等待。
为了解决这样的问题,我们可以使用basicQos方法,传递参数为prefetchCount=1。
这样告诉RabbitMQ不要在同一时间给一个消费者超过一条消息。换句话说,只有在消费者空闲的时候会发送下一条信息。
当消费者不忙时进行转发。且这种模式下支持动态增加消费者,因为消息并没有发送出去,动态增加了消费者马上投入工作。而默认的转发机制会造成,即使动态增加了消费者,此时的消息已经分配完毕,无法立即加入工作,即使有很多未完成的任务。
4.没有设置消息处理时长,如何控制一个进程kill掉之后,它上面正在处理的消息会进入其他进程,是因为rabbitmq可以监控到连接断开吗?
答:这种机制并没有超时时间这么一说,RabbitMQ只有在消费者连接断开时重新转发此信息。如果消费者处理一个信息需要耗费特别特别长的时间是允许的。
消息应答默认是打开的。
5.RabbitMQ消息模型的核心理念是生产者永远不会直接发送任何消息给队列,一般的情况生产者甚至不知道消息应该发送到哪些队列。
相反的,生产者只能发送消息给转发器(Exchange)。转发器是非常简单的,一边接收从生产者发来的消息,另一边把消息推送到队列中。转发器必须清楚的知道消息如何处理它收到的每一条消息。是否应该追加到一个指定的队列?是否应该追加到多个队列?或者是否应该丢弃?这些规则通过转发器的类型进行定义。
下面列出一些可用的转发器类型:
Direct
Topic
Headers
Fanout
Fanout是广播式的,广播式也是实时的,过时之后再打开消费者是无法收到消息的。广播式类似于观察者模式(订阅消息);
且这种方式是不存在rounting key的,对列直接绑定到Exchange上。
Direct类型的转发器背后的路由转发算法很简单:消息会被推送至绑定键(binding key)和消息发布附带的选择键(routing key)完全匹配的队列。
也可以进行多重绑定,如下,一个相同的Exchange 和 routing key,发送到不同的队列,但是接收到的信息是一样的。
使用一个绑定键(binding key)绑定多个队列是完全合法的。如上图,一个附带选择键(routing key)的消息将会被转发到Q1和Q2。
主题转发(Topic Exchange)
发往主题类型的转发器的消息不能随意的设置选择键(routing_key),必须是由点隔开的一系列的标识符组成,
一个附带特殊的选择键将会被转发到绑定键与之匹配的队列中。
关于绑定键有两种特殊的情况:
*可以匹配一个标识符。
#可以匹配0个或多个标识符。
主题类型的转发器非常强大,可以实现其他类型的转发器。
当一个队列与绑定键#绑定,将会收到所有的消息,类似fanout类型转发器。
当绑定键中不包含任何#与*时,类似direct类型转发器。