linux系统消息队列的模式和介绍

消息队列

    • 消息队列的两种模式
      • 点对点模式(生产者消费者模型)
      • 发布/订阅模式(发布者和订阅者模型)
    • 常用消息队列介绍
      • RabbitMQ
        • 主要特性
        • 安装需要
        • 优点
        • 缺点
      • ActiveMQ
        • 主要特性
        • 安装需要
        • 优点
        • 缺点
      • RocketMQ
        • 主要特性
        • 安装需要
        • 优点
        • 缺点
      • kafka
        • 主要特性
        • 安装需要
        • 优点
        • 缺点
      • 对比

消息队列的两种模式

点对点模式(生产者消费者模型)

P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。

每个消息只有一个接收者(Consumer)(即一旦被消费,消息就不再在消息队列中)发送者和接收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息接收者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式

发布/订阅模式(发布者和订阅者模型)

Pub/Sub模式包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

每个消息可以有多个订阅者发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息为了消费消息,订阅者需要提前订阅该角色主题,并保持在线运行如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

常用消息队列介绍

RabbitMQ

RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一

主要特性
可靠性: 提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制灵活的路由: 消息在到达队列前是通过交换机进行路由的。RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做RabbitMQ的插件来使用消息集群:在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用队列高可用:队列可以在集群中的机器上进行镜像,以确保在硬件问题下还保证消息安全多种协议的支持:支持多种消息队列协议服务器端用Erlang语言编写,支持只要是你能想到的所有编程语言管理界面: RabbitMQ有一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面跟踪机制:如果消息异常,RabbitMQ提供消息跟踪机制,使用者可以找出发生了什么插件机制:提供了许多插件,来从多方面进行扩展,也可以编写自己的插件
安装需要
ErLang语言包RabbitMQ安装包	
优点
由于erlang语言的特性,mq 性能较好,高并发健壮、稳定、易用、跨平台、支持多种语言、文档齐全有消息确认机制和持久化机制,可靠性高高度可定制的路由管理界面较丰富,在互联网公司也有较大规模的应用社区活跃度高
缺点
尽管结合erlang语言本身的并发优势,性能较好,但是不利于做二次开发和维护实现了代理架构,意味着消息在发送到客户端之前可以在中央节点上排队。此特性使得RabbitMQ易于使用和部署,但是使得其运行速度较慢,因为中央节点增加了延迟,消息封装后也比较大需要学习比较复杂的接口和协议,学习和维护成本较高

ActiveMQ

ActiveMQ是由Apache出品,ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能

主要特性
服从 JMS 规范:JMS 规范提供了良好的标准和保证,包括:同步或异步的消息分发,一次和仅一次的消息分发,消息接收和订阅等等。遵从 JMS 规范的好处在于,不论使用什么 JMS 实现提供者,这些基础特性都是可用的连接性:ActiveMQ 提供了广泛的连接选项,支持的协议有:HTTP/S,IP 多播,SSL,STOMP,TCP,UDP,XMPP等等。对众多协议的支持让 ActiveMQ 拥有了很好的灵活性支持的协议种类多:OpenWire、STOMP、REST、XMPP、AMQP 持久化插件和安全插件:ActiveMQ 提供了多种持久化选择。而且,ActiveMQ 的安全性也可以完全依据用户需求进行自定义鉴权和授权支持的客户端语言种类多:除了 Java 之外,还有:C/C++,.NET,Perl,PHP,Python,Ruby代理集群:多个 ActiveMQ 代理可以组成一个集群来提供服务异常简单的管理:ActiveMQ 是以开发者思维被设计的。所以,它并不需要专门的管理员,因为它提供了简单又使用的管理特性。有很多中方法可以监控 ActiveMQ 不同层面的数据,包括使用在 JConsole 或者 ActiveMQ 的Web Console 中使用 JMX,通过处理 JMX 的告警消息,通过使用命令行脚本,甚至可以通过监控各种类型的日志
安装需要
Java JDKActiveMQ安装包	
优点
跨平台(JAVA编写与平台无关有,ActiveMQ几乎可以运行在任何的JVM上)可以用JDBC:可以将数据持久化到数据库。虽然使用JDBC会降低ActiveMQ的性能,但是数据库一直都是开发人员最熟悉的存储介质。将消息存到数据库,看得见摸得着。而且公司有专门的DBA去对数据库进行调优,主从分离支持JMS :支持JMS的统一接口支持自动重连有安全机制:支持基于shiro,jaas等多种安全配置机制,可以对Queue/Topic进行认证和授权监控完善:拥有完善的监控,包括Web Console,JMX,Shell命令行,Jolokia的REST API界面友善:提供的Web Console可以满足大部分情况,还有很多第三方的组件可以使用,如hawtio;
缺点
社区活跃度不及RabbitMQ高根据其他用户反馈,会出莫名其妙的问题,会丢失消息目前重心放到activemq6.0产品-apollo,对5.x的维护较少不适合用于上千个队列的应用场景

RocketMQ

RocketMQ出自阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进,消息可靠性上比 Kafka 更好。RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景

主要特性
是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点Producer、Consumer、队列都可以分布式Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer如果做广播消费,则一个consumer实例消费这个Topic对应的所有队列,如果做集群消费,则多个Consumer实例平均消费这个topic对应的队列集合能够保证严格的消息顺序提供丰富的消息拉取模式高效的订阅者水平扩展能力实时的消息订阅机制亿级消息堆积能力较少的依赖
安装需要
Java JDK安装git、MavenRocketMQ安装包
优点
单机支持 1 万以上持久化队列RocketMQ 的所有消息都是持久化的,先写入系统 PAGECACHE,然后刷盘,可以保证内存与磁盘都有一份数据,访问时,直接从内存读取模型简单,接口易用(JMS 的接口很多场合并不太实用)性能非常好,可以大量堆积消息在broker中支持多种消费,包括集群消费、广播消费等各个环节分布式扩展设计,主从HA开发度较活跃,版本更新很快
缺点
支持的客户端语言不多,目前是java及c++,其中c++不成熟RocketMQ社区关注度及成熟度也不及前两者没有web管理界面,提供了一个CLI(命令行界面)管理工具带来查询、管理和诊断各种问题没有在 mq 核心中去实现JMS等接口

kafka

Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Apache项目的一部分。Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性

主要特性
快速持久化,可以在O(1)的系统开销下进行消息持久化高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡支持同步和异步复制两种HA支持数据批量发送和拉取zero-copy:减少IO操作步骤数据迁移、扩容对用户透明无需停机即可扩展机器;其他特性:严格的消息顺序、丰富的消息拉取模型、高效订阅者水平扩展、实时的消息订阅、亿级的消息堆积能力、定期删除机制;
安装需要
Java JDKKafka安装包
优点
客户端语言丰富,支持java、.net、php、ruby、python、go等多种语言性能卓越,单机写入TPS约在百万条/秒,消息大小10个字节提供完全分布式架构, 并有replica机制, 拥有较高的可用性和可靠性, 理论上支持消息无限堆积支持批量操作消费者采用Pull方式获取消息, 消息有序, 通过控制能够保证所有消息被消费且仅被消费一次;有优秀的第三方Kafka Web管理界面Kafka-Manager;在日志领域比较成熟,被多家公司和多个开源项目使用;	 
缺点
Kafka单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,load越高,发送消息响应时间变长使用短轮询方式,实时性取决于轮询间隔时间消费失败不支持重试支持消息顺序,但是一台代理宕机后,就会产生消息乱序社区更新较慢	

对比

Kafka在于分布式架构
RabbitMQ基于AMQP协议来实现
RocketMQ/思路来源于kafka,改成了主从结构,在事务性可靠性方面做了优化。
电商、金融等对事务性要求很高的,可以考虑RabbitMQ和RocketMQ,对性能要求高的可考虑Kafka

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】v-for中:key中item.id与Index使用的区别

先说结论&#xff0c;推荐使用【:key"item.id"】而不是将数组下标当做唯一标识&#xff0c;前者能做到全部复用 场景&#xff1a;删除无序列表中的<li>标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

vulfocus靶场搭建

vulfocus靶场搭建 什么是vulfocus搭建教程靶场配置场景靶场编排靶场优化 什么是vulfocus Vulfocus 是一个漏洞集成平台&#xff0c;将漏洞环境 docker 镜像&#xff0c;放入即可使用&#xff0c;开箱即用&#xff0c;我们可以通过搭建该靶场&#xff0c;简单方便地复现一些框架…

mysql删除idb文件,或者idb文件损坏后的修复

由于使用docker磁盘已满&#xff0c;导致建立表过程中&#xff0c;数据的插入存在问题&#xff0c;进而导致后续启动时读取该表的idb存在问题&#xff0c;导致无法启动 现在提供一种思路处理该种情况 innodb_force_recovery 选项可以让你在某些类型的错误发生时仍然启动 MySQL。…

OpenSIPS3.4.3的db_virtual模块

请看下面的配置&#xff1a; loadmodule "db_postgres.so" loadmodule "db_virtual.so" modparam("db_virtual", "db_urls", "define group FAILOVER") modparam("db_virtual", "db_probe_time", 10) …

纯血鸿蒙系统,拿什么与安卓、iOS比?

鸿蒙系统的出现就是来打破这种僵局的&#xff0c;华为鸿蒙是以生态系统为基本而产生的独立系统。如果与Android、iOS系统无异何必浪费时间。生态圈为18N&#xff0c;其中不止是app应用层开发、还有智能家居、家电、数码、车载等等一系列生态闭环。 而华为鸿蒙是全栈自研底座&am…

【明道云】如何实现循环处理

【背景】 发现明道云工作流中并没有直接的循环逻辑模块&#xff0c;那么如何实现循环呢&#xff1f; 【方案】 通过主流程获取多条数据&#xff0c;搭配子流程来实现遍历循环效果。子流程中可以直接感应获取单行数据。 如果直接在主流程中通过直接获取方式获取多条数据&…

向量数据库Milvus字符串查询

因为项目需要&#xff0c;用到了向量数据库Milvus&#xff0c;刚开始都没有遇到问题&#xff0c;直到一个表的主键是字符串&#xff08;VARCHAR&#xff09;&#xff0c;在查询时刚好要以该主键作为查询条件&#xff0c;此时会出现异常&#xff0c;特此记录一下。 记住&#xf…

如何理解CSS的边框宽度?

CSS 边框宽度学习手记 CSS 边框宽度小概念 在CSS的世界里&#xff0c;border-width这个属性真的很实用&#xff0c;它能帮我指定HTML元素四周边框的宽度。这个宽度嘛&#xff0c;可以用像素px、点pt、厘米cm、相对单位em这些来表示&#xff0c;很方便吧&#xff01;还有呢&am…

算法竞赛STL:array的使用方法

算法竞赛STL&#xff1a;array的使用方法 文章目录 算法竞赛STL&#xff1a;array的使用方法array array 容器描述&#xff1a; array是一种固定大小的容器&#xff0c;它包含指定数量的元素。每个元素都有一个非负整数索引&#xff0c;用于访问或修改它。 使用方法&#xff…

Camunda和SpringBoot的兼容版本

官网 https://docs.camunda.org/manual/7.15/user-guide/spring-boot-integration/version-compatibility/ Camunda和SpringBoot的兼容版本

iOS面试:2.操作系统

1. 什么是虚拟内存&#xff1f;有什么作用&#xff1f; 虚拟内存是计算机系统中的一种技术&#xff0c;它允许操作系统将部分硬盘空间用作临时的内存扩展&#xff0c;以满足程序运行时的内存需求。虚拟内存的主要作用是扩展计算机的内存空间&#xff0c;使得系统能够同时运行更…

26进制问题

一、问题描述 Excel地址 二、算法简析 本题要求我们将十进制转换为二十六进制。与正常的二十六进制&#xff08;数由 0 , 1 , . . . , 25 0, 1, ..., 25 0,1,...,25 组成&#xff09;不同&#xff0c;本题的二十六进制没有 0 0 0。由题意&#xff0c; ( 1 ) 10 A , ( 2 )…

微信小程序uniapp劳务咨询系统知识百科考试系统java+python+nodejs+php均支持

使用劳务咨询服务平台小程序的分别管理员和用户二个权限子模块。 管理员所能使用的功能主要有&#xff1a;首页、个人中心、用户管理、百科分类管理、知识百科管理、地区信息管理、劳务需求管理、试卷管理、试题管理、论坛交流、系统管理、考试管理等。 用户用户端可以实现首页…

更改WordPress作者存档链接author和Slug插件Edit Author Slug

WordPress默认所有用户的存档永久链接都是/author/username/&#xff0c;不管是管理员还是订阅者或贡献者或作者或编辑。如果你想要自定义用户存档链接&#xff0c;比如根据角色不同使用不一样的author&#xff0c;或者自定义作者链接中的用户名Slug&#xff0c;那么建议考虑使…

【Deep Learning 7】深度可分离卷积

&#x1f31e;欢迎来到Pytorch的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年2月21日&a…

spark sql 的join调优

背景 spark sql中join操作是最耗费性能的操作&#xff0c;因为这涉及到数据的shuffle操作&#xff0c;如果由此导致数据倾斜更是会雪上加霜&#xff0c;那么如何优化join操作的性能呢&#xff1f; join优化 方式一 broadcast广播&#xff1a; 如果是大表和小表的join操作&a…

CTFshow web(sql注入171-175)

web171 还得先爆表名 -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema database()-- 注意这里已经提示你了&#xff0c;只要知道是ctfshow_user&#xff0c;就可以拿到flag -1 union select 1,2,password from ctfshow_user…

Python第十九章(模块)

系统的模块库一般处于外部库中的Lib里面 一。导入模块的方式&#xff1a; 1.方式一&#xff1a; 导入&#xff1a;import 模块名1&#xff0c;模块名2 调用&#xff1a;模块名 . 功能名() 2.方式二&#xff1a; 导入&#xff1a;from 模块名 import 功能1&#xff0c;功能…

(每日持续更新)jdk api之ObjectOutput基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

2024.2.21

1、用多线程进行文件拷贝 #include<myhead.h>//参数结构体创建 typedef struct INFO {const char *srcfile;const char *destfile;int length; }Info;//定义获取文件长度的函数 int get_file_len(const char *srcfile,const char *destfile){int srcfd,destfd;//只读形式…