一、冪等性處理方式
1、使用唯一id
生產(chǎn)者和消費(fèi)者都需要添加配置類:
@Bean
public MessageConverter jsonMessageConverter() {
Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
jackson2JsonMessageConverter.setCreateMessageIds(true);
return jackson2JsonMessageConverter;
}
消費(fèi)者拿到id之后,保存到數(shù)據(jù)庫,后續(xù)消費(fèi)時(shí),需要查數(shù)據(jù)庫進(jìn)行比較,因此這種方案的缺點(diǎn)就是有業(yè)務(wù)的入侵,對性有一定的影響。
2、業(yè)務(wù)的冪等性
(1)查詢和刪除操作本身就是冪等性操作。
(2)可以使用分布式鎖,對單據(jù)id鎖定,防止多次提交,但是需要設(shè)置過去時(shí)間,只是避免短期重復(fù)提交,后續(xù)單據(jù)可能退回。
3、案例優(yōu)化
案例:訂單支付完成之后需要修改訂單狀態(tài),此時(shí)需要通過支付服務(wù)調(diào)用訂單服務(wù)修改訂單狀態(tài)。
解決:可以在訂單服務(wù)中增加一個(gè)對訂單狀態(tài)的判斷,如果訂單狀態(tài)不為未支付,則不能改動訂單的狀態(tài),大概邏輯如下:
- 查詢訂單信息
- 判斷訂單狀態(tài)
- 修改訂單狀態(tài)
這個(gè)案例比較特殊,是典型的比較交換邏輯,屬于樂觀鎖,因此可以優(yōu)化成為一個(gè)sql:文章來源:http://www.zghlxwxcb.cn/news/detail-810712.html
update order set oderStatus = 2 where id = ? and oderStatus = 1
當(dāng)狀態(tài)為1時(shí)才去修改為2,完美~文章來源地址http://www.zghlxwxcb.cn/news/detail-810712.html
到了這里,關(guān)于RabbitMQ-業(yè)務(wù)的冪等性的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!