消息队列的设计方案_消息队列系统毕业设计-程序员宅基地

技术标签: java  消息队列  

 构建消息队列的整体思路

设计消息队列的整体思路是先创建一个整体的数据流,例如producer发送给broker,broker发送给consumer,consumer回复消费确认,broker删除/备份消息等。 利用RPC将数据流串起来。然后考虑RPC的高可用性,尽量做到无状态,方便水平扩展。 之后考虑如何承载消息堆积,然后在合适的时机投递消息,而处理堆积的最佳方式,就是存储,存储的选型需要综合考虑性能/可靠性和开发维护成本等诸多因素。 为了实现广播功能,我们必须要维护消费关系,可以利用zookeeper/config server等保存消费关系。 

当然也并非每个消息队列的设计都是有broker的,broker(消息队列的服务端)的作用是对消息进行转存,以便在更合适的时间进行投递。

消息队列的基本功能的实现

1.RPC通信协议

其实消息队列用接地府一点的话来讲,就是将生产者producer产生发送给consumer消费者的一次RPC,先行发送到了消息队列中做暂存,再由消息队列在一个合适的时间发送给消费者进行消费,这样,一次RPC便被转为了两次的RPC,所以我们必须使用/自己实现一个RPC框架,自己实现RPC框架如果并非是对性能的极致追求,属实是没有必要的(而且个人实现的效果估计很难达到已有的成熟实现的水平),而已经有的RPC框架可以使用:Dubbo或者Thrift等成熟的实现。

2.对消息的存储(存储子系统的选择)

为了满足我们错峰/流控/最终可达等一系列需求,把消息存储下来,然后选择时机投递就是我们broker的意义。而这个存储又可以分为持久化和非持久化两种方式,持久化能更大程度地保证消息的可靠性(不易失)并且一般情况下可用存储空间都比较大(外存显然会比内存的存储容量大)。但是很多消息对于投递性能的要求大于可靠性的要求,且数量极大(如日志)。此时我们也可用非持久化的方式,将其缓存在内存,然后进行投递。

如果我们选择持久化的方案,从速度方面来抉择,文件系统>分布式KV(持久化)>分布式文件系统>数据库,但是可靠性却恰好相反。例如Kafka使用磁盘文件的持久化方式,没有提供不持久化的选择。采用数据文件+索引文件的方式处理,这块的设计比较复杂,我找个机会写篇博客,当然我们也可以选择 分布式KV(如MongoDB,HBase)等,或者持久化的Redis进行存储。

3.消费关系的保存(广播、单播关系)

在我们的消息队列现在已经初步具有了消息的转发能力(RPC)和存储能力(持久化/非持久化)的现在,我们需要更进一步的完善我们的消息队列,我们就得对发送与接收关系进行解析,这样才能实现正确的消息投递。例如Kafka定义的Topic主题、Partition分区、ConsumerGroup消费者组,消费者组对主题进行订阅,其中的消费者对各个(可能一个消费者对应多个分区)分区进行消费。这就是消息通知到一个业务集群,而一个业务集群内可以有很多台机器,一个消息只要一台机器消费就可以了。

一般比较通用的设计是支持组间广播,不同的组注册不同的订阅。组内的不同机

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46553198/article/details/119952076

智能推荐

UltraEdit-文本编辑器Mac绿色版-程序员宅基地

文章浏览阅读454次。前言更多内容,请访问我的 个人博客。简介:Ultraedit是一款在Windows系统中非常出名的文本编辑器,可以编辑文本、十六进制、ASCII 码,完全可以取代其他文本工具,同时还支持许多开发语言,如 C, Objective C, Javascript, XML, PHP, Perl, Python等,并可同时编辑多个文件,而且即使开启很大的文件速度也不会慢。功能特点:可..._ultraedit编辑mac地址

vue @click 绑定的函数,传入事件对象和自定义参数_vue @click 自定义参数-程序员宅基地

文章浏览阅读2k次。1.仅传入自定义参数html:<div id="app"> <button @click="tm(123)">ddddd</button></div>js:new Vue({ el:'#app', methods:{ tm:function(e){ console.log(e); //会输出 123 } }})2.仅传入事件对象html:<div id="app_vue @click 自定义参数

SSM宠物领养管理系统-计算机毕设 附源码73769_宠物寄养系统er图-程序员宅基地

文章浏览阅读1.3k次,点赞4次,收藏15次。关于宠物领养管理系统的基本要求(1)功能要求:可以管理首页,站点管理(轮播图,通知栏),人员管理(管理员,注册用户,发布用户),内容管理(宠物资讯,新闻分类列表),商城管理(宠物商城,分类列表,订单列表),更多管理(宠物信息,领养宠物,养宠知识)等功能模块。(2)性能:在不同操作系统上均能无差错实现在不同类型的用户登入相应界面后能不出差错、方便地进行预期操作。(3)安全与保密要求:用户都必须通过管理员审核才能进入系统。(4)环境要求:支持Windows系列、Vista系统等多种操作系统使用。2、开_宠物寄养系统er图

程序员自我养成第三天-程序员宅基地

文章浏览阅读83次。Pandas包内函数练习一话不多说,直接上图。

Gin框架入门实战系列教程之Gin环境搭建 Gin程序的热加载 Gin路由 GET POST PUT DELETE_gin 生产环境部署-程序员宅基地

文章浏览阅读406次。func main() { r := gin.Default() // 创建基于cookie的存储引擎,secret11111 参数是用于加密的密钥 store := cookie.NewStore([]byte(“secret11111”)) // 设置session中间件,参数mysession,指的是session的名字,也是cookie的名字 // store是前面创建的存储引擎,我们可以替换成其他存储引擎 r.Use(sessions.Sessions(“mysession”, store))_gin 生产环境部署

【扩频通信】8位16位64位等任意数量用户CDMA直接序列扩频通信【含Matlab源码 4229期】-程序员宅基地

文章浏览阅读730次,点赞17次,收藏27次。8位16位64位等任意数量用户CDMA直接序列扩频通信完整的代码,包运行;运行操作视频见CSDN资源!适合小白!

随便推点

H5定位问题-程序员宅基地

文章浏览阅读681次。写在最前面HTML5 Geolocation API 用于获得用户的地理位置。鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的。如:目前常见的坐标系有三种:地球坐标(WGS84,国际公认坐标),火星坐标(GCJ02,国家标准,适用于高德百度地图大陆+港澳部分、Google地图大陆部分),百度坐标(BD09,适用于百度地图大陆+港澳台部分)。我们通过浏览器所在硬件设备..._微信内置浏览器h5定位使用的是什么坐标系

c语言与linux变量,从汇编来看C语言之变量-程序员宅基地

文章浏览阅读89次。1、基础研究对如图程序进行编译连接,再用debug加载。我们在偏移地址1fa处查看main函数的内容:执行到1fd处,发现n的偏移地址为01a6,段地址存储在ds寄存器里,为07c4.再查看函数f2:参数a、b的值是用栈来传递的,它们的段地址都存放在ss寄存器中:局部变量c的值在这里是用si寄存器存储的,因为c正好是int型,那么子函数里定义的局部变量是用寄存器存储吗?我们在这里加一条赋值语句看看..._c语言的f3函数

python中字符串转xml对象_Python实现对象转换为xml的方法示例-程序员宅基地

文章浏览阅读1.7k次。本文实例讲述了Python实现对象转换为xml的方法。分享给大家供大家参考,具体如下:# -*- coding:UTF-8 -*-'''''Created on 2010-4-20@author: 忧里修斯'''import xml.etree.ElementTree as ETimport xml.dom.minidom as minidomfrom addrbook.dom..._python 字符串转xml

DBA搞钱之路

如今也是而且大部分都是,提供的岗位真多!就是搞数据库开发,比如周边的工具,或者包装下PG,MYSQL. 比如说PIGSTY工具包, 自然对你需要懂很多,尤其是商业眼光,懂C/C++语言的开发,系统内部原理. 首先你得先开发出来,然后有客户有市场,才能创业开公司.不要聚集在国内,放眼全球市场.那个啥,河北有个程序员翻墙给外网做了啥,结果获得300万都被没收了. 翻墙是不对的,是违法的,前提需要备案,然后中国电信提供翻墙业务,不能去淘宝买翻墙软件. 这对你要求很高,要有商业眼光,要有开发能力,要会英语交流!

ROS(ERROR):Rosdep cannot find all required resources to answer your query_error: rosdep cannot find all required resources t-程序员宅基地

文章浏览阅读1w次,点赞8次,收藏12次。今天LZ在运行下面给代码时出现rosdep install rgbdslam然后报如下错误:ERROR: Rosdep cannot find all required resources to answer your queryMissing resource rgbdslamROS path [0]=/opt/ros/indigo/share/rosROS path ..._error: rosdep cannot find all required resources to answer your query missin

PS1~4,终端提示符设置_echo $ps1返回\s-\v\$-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏7次。终端可以说是在Linux的使用中最常用到的工具了,通过设置PS1,PS2,PS3,PS4这四个环境变量,我们就可以个性化定制终端的提示符。一、PS1—默认的交互提示符默认情况下PS1为”\s-\v\$”,显示为-bash-3.2$通过改变PS1,就可以在提示符显示一些对我们有用的信息,如用户名、工作目录、系统时间等-bash-3.2$export PS1_echo $ps1返回\s-\v\$

推荐文章

热门文章

相关标签