发布于2021-03-10 19:13 阅读(1271) 评论(0) 点赞(23) 收藏(3)
现在大多都使用 MQ 来做系统的异构,来做系统的解耦,系统的的模块相当于寄信者与收信者,MQ 则扮演者邮局的角色。作为一个中转的角色,就需要确保消息的100%投递。
今天我们就来研究一下如何确保消息的100%的投递。
RabbitMQ 所做的确保是:只要你把消息投递到 Broker 中,那么我就确保这个消息会送达到消费者的手中。
当然这是有前提条件的,比如:
结合 RabbitMQ 的特性来做分析,针对于投递端,我们只需要确保把消息发送到 Broker 中即可,那么如何保证可靠性呢,分下列步骤:
只要做到上面五步,基本上我们就可以保证,消息投递100%的投递出去。
上述的方案看似完美无缺,但是细想,如果在 step4 中 Broker 发送应答的过程中,网络出现问题这个消息没有到达生产者会导致整个流程进入补偿的流程当中,此时 Broker 中就有两条消息,也就是发成了重复的投递的问题,所以接下来我们要在消费端来处理这个问题。
因为上述我的消息都有唯一的标识,所以我们只需要查找对应的消息对应的标识来判断其状态即可
首先说明不同的方案使用不同的应用场景,不要一上来你就说十几万的并发怎么样的,这个慢慢来,一步步往这里走
1):不能再简单了,在并发不大的情况可以接受
2):对分页和排序是有帮助的
1):分库分表和读写分离多住从的情况下不适用
2):性能达不到要求时,不利于扩展
3):不同数据库的语法实现不一样
1):redis 单线程可以生成全局唯一ID
2):可以使用 redis 集群获取更高的吞吐量
1):引入新的组件,增加系统复杂度
2):需要注意处理并发问题
snowflake 是 twitter 开源的一个分布式的 ID 的生成算法,结果是一个 long 的ID,使用 41bit 作为毫秒数,10bit 作为机器 ID(5个 bit 是数据中心,5个 bit 是机器 ID) 12 bit 作为毫秒内的流水号(每个节点每毫秒可以产生 2^12 = 4096 个 ID)最后是一个符号位,
1):不依赖数据库和其他的中间件,且性能尚可
1):是有依赖时间的,如果各个机器的失重不同步就会出现不适全局递增的情况
最后,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 RabbitMQ 系列面试题和答案,非常齐全。
作者:热心市民小陈
链接:blog.csdn.net/weixin_42849915/article/details/87828163
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
近期热文推荐:
1.600+ 道 Java面试题及答案整理(2021最新版)
2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!
3.阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式发布,全新颠覆性版本!
觉得不错,别忘了随手点赞+转发哦!
作者:Djfj
链接:http://www.javaheidong.com/blog/article/112427/1f49b21bfb10d12df6ee/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!