rabbitMQ解決分散式事物
阿新 • • 發佈:2018-11-13
RabbitMQ解決分散式事務原理: 採用最終一致性原理。
需要保證以下三要素
1、確認生產者一定要將資料投遞到MQ伺服器中(採用MQ訊息確認機制)
生產者傳送訊息程式碼:
// 封裝訊息 Message message = MessageBuilder.withBody(msg.getBytes()).setContentType(MessageProperties.CONTENT_TYPE_JSON) .setContentEncoding("utf-8").setMessageId(orderId).build(); // 構建回撥返回的資料 CorrelationData correlationData = new CorrelationData(orderId); this.rabbitTemplate.setMandatory(true); this.rabbitTemplate.setConfirmCallback(this); // 傳送訊息 rabbitTemplate.convertAndSend("order_exchange_name", "orderRoutingKey", message, correlationData);
生產者繼承 RabbitTemplate.ConfirmCallback ,重寫confirm方法
// 生產訊息確認機制 @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { String orderId = correlationData.getId(); System.out.println("訊息id:" + correlationData.getId()); if (ack) { System.out.println("訊息傳送確認成功"); } else { send(orderId); System.out.println("訊息傳送確認失敗:" + cause); } }
2、MQ消費者訊息能夠正確消費訊息,採用手動ACK模式(注意重試冪等性問題)
3、如何保證第一個事務先執行,採用補償機制,在建立一個補單消費者進行監聽,如果訂單沒有建立成功,進行補單。