目录
事务
消息分发
应用场景
1. 限流
2.负载均衡
事务
RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制.SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败.
何为原子性(面试重点)?
例如: 当A向B转账1000元,会经历俩个步骤
1.A 向 B 转账 1000元 A的账号将会减去1000元
2.B将会收到1000元 B的账号将会增加1000元
可是,如果遇到极端情况,当A向B转账1000元时,A-1000元已完成,这个时候系统出现故障,导致A-1000 但是B却没有接收到 那么1000元将无缘无故丢失了 ,肯定不会允许这种事情发生,不然谁还敢转账。
此时就是将1操作和2操作绑定在一起,要么同时完成,要么一个都不执行
当出现1执行失败的时候,将1操作进行“回滚”,回到原来的状态,就当一切都没发生过
接下来实现rabbitmq的事务
声明队列:
//事务
public static final String TRANS_QUEUE = "trans_queue";
@Bean("transQueue")
public Queue transQueue() {
return QueueBuilder.durable(Constants.TRANS_QUEUE).build();
}
配置事务管理器:
@Bean
public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory) {
return new RabbitTransactionManager(connectionFactory);
}
@Bean("transRabbitTemple")
public RabbitTemplate transRabbitTemple(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
//开启事务
rabbitTemplate.setChannelTransacted(true);
return rabbitTemplate;
}
生产者代码编写:
@RequestMapping("/trans")
public String trans() {
System.out.println("trans test...");
transRabbitTemplate1.convertAndSend(Constants.TRANS_EXCHANGE, "trans", "trans test 1...");
int num = 5/0;
transRabbitTemplate1.convertAndSend(Constants.TRANS_EXCHANGE, "trans", "trans test 2...");
return "消息发送成功";
}
测试:
1)不带 @Transactional 带异常的发送 看看会发生什么?