RabbitMQ复习
1.如何确保生产者一定会把消息发送到了消息系统。
首先不推荐使用事务的方式,因为事务会严重拖慢rabbitmq的性能。其次就是保证消息生产者发送到交换机成功,和交换机发送到消息队列成功。
一:消息生产者发送交换机,可以使用消息发送方确认,方式来保证。
二:交换机到消息队列,可以使用失败回调的操作,来处理未成功发送到队列的消息。
消息发送方确认的实现方式:
1.开启消息确认机制
2.自定义失败后的回调方法:
失败回调的实现方式
1.开启消息确认机制(同上)
2.开启失败回调
2.使用消息解析器来对消息格式进行设置
3.如果给交换机设置一个备用交换机,那么就不会调用失败回调的方法,而且消费者是可以消费到消息的。
4.消费者来消费消息有两种方式:1.通过注解来直接进行消费。2.使用@Bean来进行注入消费
通过注解来直接进行消费
@RabbitListener(queues = "testQueue")
public void get(Message message,String string) throws Exception{
System.out.println(new String(message.getBody(),"UTF-8"));
System.out.println("消费者1");
}
使用@Bean的方式来进行消费:
@Bean
public SimpleMessageListenerContainer simpleMessageListenerContainer() {
SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
simpleMessageListenerContainer.setConnectionFactory(new ConnectionFactory() {
@Override
public Connection createConnection() throws AmqpException {
return null;
}
@Override
public String getHost() {
return null;
}
@Override
public int getPort() {
return 0;
}
@Override
public String getVirtualHost() {
return null;
}
@Override
public String getUsername() {
return null;
}
@Override
public void addConnectionListener(ConnectionListener connectionListener) {
}
@Override
public boolean removeConnectionListener(ConnectionListener connectionListener) {
return false;
}
@Override
public void clearConnectionListeners() {
}
});
simpleMessageListenerContainer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
System.out.println("这是获取到的消息"+message.toString());
}
});
//监听的消息队列
simpleMessageListenerContainer.addQueueNames("","");
//开启手动确认消息
simpleMessageListenerContainer.setAcknowledgeMode(AcknowledgeMode.MANUAL);
return simpleMessageListenerContainer;
}
5.rabbitMq默认从队列中给消费者发送消息,是一次性全都发给消费者,之后消费者在一条条消费消息。我们可以修改成(消息预取),一次只取一条消息,等消费完再去取下一条消息
channel.basicQos(1);之后每次手动确认。手动确认的目的是,只有手动确认后,下一条消息才会发送出来。
所以使用批量处理消息可以极大的提高性能(每次处理2500);
6.死信交换机:死信交换机就是为一个交换机配置一个处理没有消费的消息的交换机,使用这个死信交换机,可以重新指定队列来消费退回的消息。
一共有三种消息可以退回到死信交换机中:
1.被退回的消息
2.过期的消息
3.当发送的消息超过了队列的最大容量,超过的部分可以放到死信交换机。
死信交换机使用的经典场景:超时订单的处理。
7.Rabbitmq集群有两种形式:1.普通配置 2.镜像配置(普通配置和镜像配置的区别是:镜像配置可以选择一个master节点,并且这个节点有集群所有的队列信息)
RabbitMq集群会把所有节点的队列和交换机信息复制一份。这里复制的队列只是队列的配置信息(元数据),不会复制队列的实体。
RabbitMq天然支持集群操作,只需要把.erlang.cookie的文件中的值设置成一致的即可。
RabbitMq在配置集群的时候,第一步:需要启动rabbitmq服务,并且关闭rabbitmq的应用;(rabbitmqctl stop_app)。第二步:加入其它节点:(rabbitmqctl joincluster rabbit@rabbitmq1 --ram )。第三步:启动应用(rabbitmqctl start_app)
推荐:在一个rabbitmq集群中,最好配置两个磁盘节点。