问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

消息队列之zeroMQ、rabbitMQ、kafka

发布网友 发布时间:2022-09-13 02:54

我来回答

1个回答

热心网友 时间:2024-07-06 15:36

      首先消息是网络通讯的载体,队列可以理解是一种先进先出的数据结构,消息队列是存放消息的容器,是分布式系统中的重要组件。消息队列的优势在于:解耦、异步、削峰,把相关性不

强的模块独立分开视为解耦,异步就是非必要逻辑异步方式处理,加快响应速度,削峰是避免短期高并发导致系统问题进行缓冲队列处理。消息队列的缺点在于:加强系统复杂性、系统可用性降低,使

用了消息队列系统出现问题排查的范围就变大、需要考虑消息队列导致的问题。

          本文说明主流的消息队列,针对使用过的zeroMQ和rabbitMQ、Kakfa:

          zeroMQ :C语言开发,号称最快的消息队列,本着命名zero的含义,中油中间架构使用简单,表面上是基于socket的封装套接字API,在多个节点应用场景下非常灵活、架构的可扩展性很强,

实现N到M的协同处理;

            zmq的socket模式: req、rep、push、pull、pub、sub、router、dealer。

          (1)req和rep:请求回应模型,req和rep都可以请求和回答,不同的只是req是先send再rec,rep是先rec再send。支持N个请求端一个接收端,也支持N个接收端一个请求端。N个接收端采

用rr负载均衡。 哪个是“一”端,哪个就bind端口,“N”端就只能connect,所以,req+rep无论谁bind端口,肯定要有一个是“一”。

          (2)  router和dealer:随时可以发送和接收的req和rep,看起来router+dealer跟 req+rep属于同类功能。因为router和dealer可以随时发送接收,所以它们可以用来做路由。一个router用来响

应N个req,然后它在响应处理的时候,再通过另一个socket把请求扔出去,接收者是另外的M个rep,这就做到N:M。

         (3)pub和sub :订阅和推送,对应发布者和订阅者。

         (4)push和pull:就是管道,一个只推数据,一个只拉数据。

           rabbitMQ :使用erlang语言开发,高并发特点,基于AMQP(即Advanced Message Queuing Protocol)的开源高级消费队列,AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/

订阅)、可靠性、安全),企业级适应性和稳定性,并且有WEB管理界面方便用户查看和管理。以下是rabbitMQ的结构图:

         (1)Procer:数据发送方,一般一个Message有两个部分:payload(有效载荷)和label(标签),payload是数据实际载体,label是exchange的名字或者一个tag,决定发给哪个Consumer;

         (2)Exchange: 内部 消息交换器,exchange从生产者那收到消息后,一般会指定一个Routing Key,来指定这个消息的路由规则,当然Routing Key需要与Exchange Type及Binding key联合使用

才能最终生效,根据路由规则,匹配查询表中的routing key,分发消息到queue中;

         (3)binding:即绑定,绑定(Binding)Exchange与Queue的同时,一般会指定一个Binding key,但不一定会生效,依赖于Exchange Type;

         (4)Queue:即队列是rabbitmq内部对象,用于存储消息,一个message可以被同时拷贝到多个queue中,queue对load balance的处理是完美的。对于多个Consumer来说,RabbitMQ 使用循

环的方式(round-robin)的方式均衡的发送给不同的Consumer;

         (5)Connection与Channel: Connection 就是一个TCP的连接,Procer和Consumer都是通过TCP连接到RabbitMQ Server, Channel 是为了节省开销建立在上述的TCP连接中的接口,大部

分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等;

        (6)Consumer:即数据的接收方,如果有多个消费者同时订阅同一个Queue中的消息,Queue中的消息会被平摊给多个消费者;

        (7)Broker: 即RabbitMQ Server,其作用是维护一条从Procer到Consumer的路线,保证数据能够按照指定的方式进行传输;

       (8)Virtual host:即虚拟主机,当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue;

         rabbitMQ消息转发中的路由转发是重点,生产者Procer在发送消息时,都需要指定一个RoutingKey和Exchange,Exchange收到消息后可以看到消息中指定的RoutingKey,再根据当前

Exchange的ExchangeType,按一定的规则将消息转发到相应的queue中去。三种Exchage type:

       (1)Direct exchange :直接转发路由,原理是通过消息中的routing key,与binding 中的binding-key 进行比对,若二者匹配,则将消息发送到这个消息队列;

          比如:消息生成者生成一个message(payload是1,routing key为苹果),两个binding(binding key分别为苹果、香蕉);exchange比对消息的routing key和binding key后,将消息发给了queue1,消息消费者1获得queue1的消息;

       (2)Topic exchange: 通配路由,是direct exchange的通配符模式,

          比如:消息生成者生成一个message(payload是1,routing key为quick.orange.rabbit),两个binding(binding key分别为*.orange. 、 *.*.rabbit);exchange比对消息的routing key和binding key

后,exchange将消息分发给两个queue,两个消费者获得queue的消息;

     (3)Fanout exchange: 复制分发路由,原理是不需要routkey,当exchange收到消息后,将消息复制多份转发给与自己绑定的消息队列,

          比如:消息生成者生成一个message(payload是1,routing key为苹果),两个binding(binding key分别为苹果、香蕉);exchange将消息分发给两个queue,两个消费者获得queue的消息;

       rabbiMQ如何保证消息的可靠性?

     (1)Message rability:消息持久化,非持久化消息保存在内存中,持久化消息写入内存同时也写入磁盘;

     (2)Message acknowledgment:消息确认机制,可以要求消费者在消费完消息后发送一个回执给RabbitMQ,RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移

除。通过ACK。每个Message都要被acknowledged(确认,ACK)。

     (3)生产者消息确认机制:AMQP事务机制、生产者消息确认机制(publisher confirm)。

     最后, 对比一下zeroMQ、rabbitMQ、kafka主流的消息队列的性能情况:

      对比方向                                                                          概要

      吞吐量                             万级 RabbitMQ 的吞吐量要比 十万级甚至是百万级Kafka 低一个数量级。ZeroMQ号称最快的消息队列系统,尤其针对大吞吐量的需求场景。

      可用性                            都可以实现高可用。RabbitMQ 都是基于主从架构实现高可用性。 kafka 也是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用

      时效性                             RabbitMQ 基于erlang开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。其他两个个都是 ms 级。

      功能支持                          Kafka 功能较为简单,主要支持简单的MQ功能,在大数据领域实时计算以及日志采集被大规模使用;ZeroMQ能够  实现RabbitMQ不擅长的高级/复杂 的队列

      消息丢失                          RabbitMQ有ack模型,也有事务模型,保证至少不会丢数据,  Kafka 理论上不会丢失,但不排除批量情况下。

      开发环境                          RabbitMQ需要erlang支持、kafka基于zookeeper管理部署、zeroMQ程序编译调用即可

      封装库                               基于c++开发,使用RabbitMQ-C,cppKafka,而zeroMQ基于C语言开发,无需封装
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
东风风神AX7我想四个轮胎互换位置,胎压监测怎么学习?必须4s店电脑处理吗... 电脑鼠标的右键不好用 有时要按几次才可以 这是什么问题 ? 要怎么办... 怎样解决电脑右键要点好几次才能打开菜单? 鼠标右键不好用。按好几下才出来右键菜单。 我无限鼠标右键有时候点一下没反应,按多几下才有反应是怎么回事?_百度... 南京的邮编号是多少? 最近有什么好看的动作片、战争片吗?反正要很打的,最好是中国的,外国的... 进来有什么好看的的电影? 衢山岛旅游花费大概多少,小洋山景区现在要门票吗 最新电视有哪些 Cannot assign requested address问题总结 化妆品眼影要不要和bb霜放一起过安检 高铁上能带眼影吗!請回答我很急 iphone 4s 定位服务 无法定位 如何解决苹果4S无法定位问题 苹果4s定位打开也无法定位怎么办? 坐飞机可以带眼影吗 苦瓜番茄炒肉片怎么做 眼影盘能带上火车嘛 飞机上可以带眼影盘吗 桂花奶茶的做法,桂花奶茶怎么做好吃,桂花奶茶的家常 怎么打开电动车座位? 和一个女孩子在社交app上聊天,怎么知道她是不是对的般配的人?_百度知 ... 她有APP吗? 又是我,跟一位女生在APP认识的,天天聊了有一个月,她偶尔也有主动找我... 爱她APP怎么样 女朋友老是在轻友app上和别的男的聊天 诸侯娶九女:皇帝后宫究竟有多少女人 盘点古代皇帝后宫的妃子数量到底有多少 皇帝的后宫嫔妃女人一般都有多少人? 蝴蝶梅怎么扦插 阿斯顿马丁超跑SUV上市,这辆车如何? 不是摆摆样子,阿斯顿马丁DBX真敢去越野 西安哪家医院眼科好 阿斯顿·马丁首款SUV DBX原型车曝光,越野范十足 阿斯顿马丁db11是跑车还是越野 阿斯顿马丁SUV DBX实拍,对标宾利添越和兰博基尼URUS,内饰豪华 阿斯顿马丁有几款车型? 阿斯顿·马丁DBX量产版SUV正式下线 汉服分类及名称是什么 vivo7s手机配置 阿斯顿·马丁 2013阿斯顿马丁越野车是什么款 阿斯顿马丁属于跑车吗? QQ超级会员兑换的东西怎么查 现代朗动中控屏幕不亮了,朗动中控屏黑屏怎么办 现代朗动汽车装的导航黑屏,USB,、DVD、收音机都播放不了,倒车影像有显... igbu异构能力是什么,有什么用。通俗一点 关于通讯的作文怎么写 梦见挖棺材