接口幂等性是指: 一个接口用同样的参数反复调用,不会造成业务错误,那么这个接口就是具有幂等性的;如何避免消息的重复消耗题目?(消息消耗时的幂等性)
注册接口;
发送短信验证码接口; 比如同一个订单我付出两次,但是只会扣款一次,第二次付出不会扣款,这阐明这个付出接口是具有幂等性的;
全局唯一 ID + Redis消息重复消耗
生产者在发送消息时,为每条消息设置一个全局唯一的 messageId,消耗者拿到消息后,使用 setnx 下令,将 messageId 作为 key 放到 Redis 中:setnx(messageId, 1);
这里是利用 Redis 的一个 setnx 不可重复,原子性的特征。
- 若返回1,阐明之前没有消耗过,正常消耗;
- 若返回0,阐明这条消息之前已消耗过,抛弃;
MQ 消耗者的幂等性的解决一样平常使用全局 ID 或者写个唯一标识比如时间戳 或者 UUID 或者订单消耗 者消耗 MQ 中的消息也可利用 MQ 的该 id 来判断,或者可按本身的规则天生一个全局唯一 id,每次消耗消 息时用该 id 先判断该消息是否已消耗过。消耗端的幂等性保障
利用 redis 执行 setnx 下令,天然具有幂等性。从而实现不重复消耗2. RabbitMQ 消息队列的 “ 优先级队列 ” 的题目
简单的来说就是:我们须要让生产者(含有优先级)发送的消息,必须让其存放在队列当中,并且要是到达一定的量,让其在队列当中进行可以有一个时间进行一个(根据优先级上进行一个排序),否则,如果只有一个,就不须要将队列进行排序,因为只有一个就不存在一个优先级的题目。只有存在多个的时候,这样才有时机对消息进行一个排序。实战:消息队列的“优先级队列” 的具体代码实现:
队列具备两种模式:default 和 lazy。默认的为 default 模式,在 3.6.0 之前的版本无需做任何变更。lazy 模式即为惰性队列的模式,可以通过调用 channel.queueDeclare 方法的时候在参数中设置,也可以通过 Policy 的方式设置,如果一个队列同时使用这两种方式设置的话,那么 Policy 的方式具备更高的优先级。 如果要通过声明的方式改变已有队列的模式的话,那么只能先删除队列,然后再重新声明一个新的。内存开销对比:
在队列声明的时候可以通过 “x-queue-mode” 参数来设置队列的模式,取值为“default”和 “lazy” 。下面示 例中演示了一个惰性队列的声明细节:复制代码
- Map<String, Object> args = new HashMap<String, Object>();
- args.put("x-queue-mode", "lazy");
- channel.queueDeclare("myqueue", false, false, false, args);
在发送 1 百万条消息,每条消息大概占 1KB 的情况下,普通队列占用内存是 1.2GB,而惰性队列仅仅占用 1.5MB3.4 实操演练
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和复兴是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |