实用docker容器推荐?
推荐MySQLRedisMongoDB等存储容器,非常方便本地开发和学习。此外,还有一系列类似于nacosgitlabrock
RocketMQ是如何应对每天1500亿条的数据处理的?
这个问题太大了。简单来说,发布者发出消息后,消息数据已经以文件的形式相对有序地存储在各个服务器中,消费者也相对有序地消费了消息数据。关键点是消息的分布式存储、异步传输和内存的零拷贝。
rabbitmq和rocketmq区别?
RabbitMQ基于具有跨语言特性的AMQP协议,支持多种开发语言,用erlang语言编写,天生具有高并发性。
Rock
JAVA面试如何保证消息不被重复消费?如何保证消息消费的幂等性?
今天,让我们让我们看一些方案来确保MQ的幂等性。
01.幂等的概念
我先说说什么是幂等。
当用户一次或多次请求同一个操作时(多次发送或接收消息),最终结果是一致的,不会因为多次请求而产生副作用;比如同一个订单付款两次,客户最后应该只扣一次。
查询和删除:查询自然是幂等的。在数据不变的前提下,相同查询条件下一次查询和多次查询的结果相同;删除也是如此。如果同一个条件删除一次,删除多次,可能删除的数据量是不一样的,但是数据库里的数据不会因为重复删除而不一样。
添加和修改:如果你不t做幂等处理,可能会出现问题;多次添加可能导致多个相同的数据(主键是自动生成的);如果只是将部分字段更新为固定值,不会出现幂等问题,但是如果新值需要在旧值上进行处理和计算,比如增加多少,减少多少,那么重复执行后结果就不一样了。
消息不是等幂的。
1.生产者通常使用超时重传机制向MQ发送消息,但是如果生产者s消息已经发出,但是由于网络原因没有收到确认信息,可能会重新发送,最终导致消息重复发送。
2.消费者消费的过程也差不多。消费者收到来自MQ的消息,但MQ没有收到确认消息,因此消息可能会重新发送给其他消费者,或者网络恢复后再次发送给消费者,最终导致重复消费。
03.解决办法
1.唯一索引
使用唯一索引可以有效防止脏数据的添加:当一个表中存在唯一索引时,并发添加相同数据时会报错,但这是在单个数据库、单个表的情况下。只有等待后才有效。如果项目的数据量很大,采用将数据库分表的策略,那么幂等性的问题就无法再通过数据库的唯一索引来解决了。
2.全球唯一ID
每封邮件都带有一个全球唯一的ID。当消费者收到消息时,他在执行之前判断这个ID是否已经在本地存在。如果不存在,他记录执行后的ID(存储在数据库或Redis中,表示交易已经执行)。如果已经存在,说明该消息已经被消费,不能再次执行。
在许多分布式架构中,全球唯一ID将被用作基本的微服务。当然,这种服务的可靠性极高,或者可以由每个应用程序使用并生成全局唯一的ID算法。然而,总的来说,实现引入全球唯一ID的方案仍然非常麻烦。
3.营业状况
为了保证消息的幂等性,也可以结合业务流程来考虑。例如,许多业务流程在每一步都是有状态的。例如,在线购物可能包括:订单创建、支付和交付,因此保单状态为"待定付款"付款前,保单状态可以更改为"等待交付和付款后;然后,如果发起重复扣款,第二次扣款时保单状态已经改变,扣款失败。
步骤4:复制表格
如果服务中有一个唯一的标识符,您可以使用一个复制表将这个唯一的表示保存在复制表中。如果重复插入,将被检查。
例如,在上面的场景中,一个订单只会支付一次,所以在支付时,将订单号作为唯一标识符保存在重复表中,以确保支付操作只会发生一次;这种方法也使用唯一ID,但与全局唯一ID不同,这个唯一ID是特定于特定业务的。
我会继续分享我对Java开发、架构设计、程序员职业发展等方面的看法,希望得到大家的关注。