例如在交易之类的场景,如果通过使用消息队列等方式进行异步处理,来提高并发的同时,怎样保证该业务100%可靠?
1、可靠性要求
业务是否真的需要保证100%可靠?还是只要满足4个9可靠即可?
- 对于交易类:必须100%可靠。
- 对于其他,则保证4个9或者5个9的可靠。4个9是工业级别标准。
2、如何在高可用情况下保证100%可靠?
措施:最终一致性事务,不一致补偿机制和ack。
业务操作和发送消息在一个事务里,消息发送成功需要ack机制,此时是需要阻塞的。
3、如果消息在消息队列里丢失,该如何操作?
消息复制,比如才用多消息队列保存消息。并且消息必须持久化。
4、最后设计方案
多个本地事务代替分布式事务,各个节点用消息复制和持久化方式保证消息不丢,各个节点之间的最终一致性使用幂等消息来保证,幂等消息可以多次重试。
* 理论大家都会说,真正到了实现的时候,就困难重重 *
目前比较好的消息中间是:Kafka和阿里的RocketMQ(前身MetaQ)。
*路漫漫其修远兮!