在互联网开发中,分布式系统中的最难点可以说是分布式事务。
在分布式系统中,由于一个微服务连接一个库,一个业务操作多个库操作时,本地数据库操作+远程调用操作数据库,这时存在分布式事务问题。
例如:
1.库A成功,远程调用库B也成功,但事务提交失败,这时B库依然产生数据
2.库A操作成功,远程调用库B超时(熔断等),这时A库回滚,B库依然可能产生数据
解决分布式事务问题的核心在于:
1.生产者可靠生产消息
2.消费者可靠消费消息
1.可靠生产消息-记录消息发送
创建一个消息表,存储发往MQ的数据及状态
2.可靠生产消息-修改消息发送状态
rabbitmq开启消息:发送确认机制
在services里初始化一个方法,处理rabbitmq收到消息的ack回执,修改消息表的状态
这里还需要注意,可能存在回执没收到的情况,这时要有兜底方案,定时任务扫描消息表,重发机制
3.可靠处理消息-正常处理
开启手动ACK模式。由消费者控制消息的重发/清除/丢弃
幂等性。防重处理
4.1可靠消息处理-消息重发
消费者处理失败,需要MQ再次重发给消费者。
出现异常一般会重试几次,由消费者自身记录重试次数,并进行次数控制。
4.2可靠消息处理-消息丢弃
消费者处理失败,直接丢弃或者转移到死信队列(DLQ)
重试次数过多,消息内容格式错误等情况,通过线上预警机制通知运维人员。