RabbitMQ使用总结
2017-12-15 本文已影响20人
RobertCrazying
MQ是互联网业务比较常见的解耦利器,一下简单介绍下RabbitMQ的一些使用。
解耦
典型的一个场景就是订单系统和财务结算系统。订单系统生成订单之后只需要发一个MQ通知到财务系统进行相应的金额账户扣减即可。这里因为用户不需要等待财务系统的操作所以很适合使用MQ的解耦提高用户体验。系统间保持最终一致性即可
image.png
削峰填谷
简单来说就是控制平衡多个系统之间的流量。可以使用MQ的拉取模式来控制消费端的消费速度。与传统的消费端监听模式不同的是拉取模式不需要再配置文件里面配置listener了,如下代码指定即可:
messageConsumer.start();
for (int i=0;i<100;i++){
//手动拉取消息
messageConsumer.pull(topic,messageListener);
}
每调用一次拉取一次,可以开启多线程并行消费。监听模式是有消费端的守护线程不停地拉取消息消费的,更适合要求响应快的读取的场景。拉取模式适合最终能落地可控流量的写场景。
重试补偿
由于在系统之间使用MQ通讯会出现各种网络异常,例如消费端消费成功但是因为生产端异常回滚通过定时任务重新发起MQ,这时如果消费端没有实现消费的幂等性就会造成数据的不一致。其中一个解决方案是,生产端发送MQ时带上请求的流水号并妥善保存,每一条业务实例如订单重试的时候需要带上相同的流水号,这样消费端消费时根据流水号检测到已经处理过就不会错误地重复处理了从而能保证消费的幂等性与数据一致性。发送端只需要把生成订单和发送MQ这个操作放到一个本地事务即可保证最终的一致性。
image.png
总结
我简单介绍了下MQ的一些使用经验和场景。重点列举了重试补偿机制和数据一致性的实践,希望以后的学习工作中能更加合理地使用。