中间件 MetaQ

devtools/2025/1/18 18:27:32/

MetaQ(全称Metamorphosis)是一个高性能、高可用、可扩展的分布式消息中间件,其思路起源于LinkedIn的Kafka,但并不是Kafka的一个Copy。以下是关于MetaQ的详细介绍:
基本特性
•  高性能:具有消息存储顺序写、吞吐量大等特性,适用于大吞吐量、顺序消息、广播和日志数据传输等场景。
•  高可用:基于其物理部署架构实现高可用性。生产者为消息定义topic后,消费者可以订阅该topic,消息就有了从生产到消费的路由指向。
•  可扩展:能够根据业务需求进行水平扩展,以应对不断增长的消息处理量。


架构原理
•  生产者-消费者模型:采用典型的生产者-消费者模型,核心作用是解耦。生产者负责产生消息并发送到MetaQ服务器,消费者则负责接收消息并处理,使得生产者和消费者彼此没有直接依赖,从而实现了同步到异步的转换。
•  消息传递方式:消息传递是通过发布-订阅的方式进行的。生产者将消息发布到一个或多个主题(Topic)上,消费者则订阅这些主题,并从MetaQ服务器拉取数据并解析成消息进行消费,可实现一对多、多对多的消息传递模式。
•  物理架构:
•  Producer:消息生产者,与NameServer随机一个节点建立长连接,定时从NameServer获取topic路由信息,与master broker建立长连接,定时发送心跳,只与master建立连接产生通信,不与slave建立连接。
•  Consumer:消息消费者,与NameServer随机一个节点建立长连接,定时从NameServer获取topic的路由信息,并获取想要消费的queue。可以和提供服务的master或slave建立长连接,定时向master和slave发送心跳,既可以从master订阅消息,也可以从slave订阅消息。
•  消息存储:将消息存储(持久化)到位于生产者和消费者之间的一个消息代理(Message Broker)上。消息模型包括Message(单位消息)、Topic(消息的类型,生产者对应消费者的分区标识)、Tag(消息在相同Topic时的二级分类标识,可用于消息的筛选)、Queue(物理分区,一个Topic对应多个Queue)、Group(生产者或消费者的逻辑分组,同一个Group的生产者/消费者通常生产/消费同一类消息,并且生产/消费的逻辑一致)、Offset(偏移值,表示消费到的位置或待消费的消息位置)。


消息机制
•  消息分发:生产者发送的每一个消息会对应到某个Topic下,对于该Topic,可以有若干个Group进行订阅。当某条消息发送到某个Topic下时,所有订阅该Topic的group都会收到该消息的一个复制消息。而当消息从Group下发到某个机器时,会根据负载等其他机制选择该group下的某台机器进行处理。对于Group下的多台机器,只会有一台机器收到对应消息的复制消息。
•  消息消费:消费者通过指定Consume queue的位点来读取消息,通过提交Consume queue的位点来维护消费进度。Consume queue每个条目长度固定,单个ConsumeQueue文件默认最多包括30万个条目。这样做的好处是队列非常轻量级,且在消费过程中都是顺序读取,速度非常快。
•  消息过滤:当某台机器得到消息时,可以根据其Tag来进行选择不同的处理器进行处理,主要是用来对消息进行处理过滤。例如,对于带有标签“newuser”的消息,可以选择对应的“newuser”处理器进行处理。


应用场景
•  异步解耦:将耗时的任务异步化,通过消息队列缓存任务,从而实现消息发送方和接收方的解耦,使得任务的处理能够异步、并行,提高系统或集群的吞吐量和可扩展性。
•  Mysql数据复制:可用于实现数据库的数据复制功能。
•  日志收集:可以收集日志数据,便于进行后续的日志分析和处理。
•  削峰填谷:在流量高峰期间,控制服务器处理的QPS,防止大流量打挂数据库等导致服务器宕机,让服务处理请求更加平缓,节省服务器资源。同时,将阶段性的大流量请求缓存起来,在流量平缓的时候慢慢处理,防止过多的请求被拒绝后的重试导致更大的流量。


其他特点
•  支持本地和XA事务:能够满足不同业务场景下的事务需求。
•  通信协议:通信组件直接使用Netty,在其上做了简单的封装。Netty是一个事件驱动的网络编程框架,具备高性能、高可靠性。
•  数据存储结构:消息存储是由CommitLog和ConsumeQueue配合完成的,CommitLog真正存储消息,ConsumeQueue存储消息在CommitLog上的索引。每个Topic下的每个Queue都有一个ConsumeQueue文件,每个Broker上的CommitLog被该机器上的所有Queue共享。

 


http://www.ppmy.cn/devtools/151622.html

相关文章

JavaScript语言的数据结构

JavaScript中的数据结构 引言 在编程的世界里,数据结构是处理和组织数据的重要方式。数据结构的选择往往直接影响到程序的性能和可维护性。JavaScript作为一门广泛使用的编程语言,在数据结构的设计和使用上也有其独特的特点。本文将深入探讨JavaScript…

力扣-数据结构-21【算法学习day.92】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…

信创改造-龙蜥操作系统搭载MySql、Tomcat等服务

龙蜥操作系统 Anolis OS 8 是 OpenAnolis 社区推出的完全开源、中立、开放的发行版,它支持多计算架构,也面向云端场景优化,兼容 CentOS 软件生态。Anolis OS 8 旨在为广大开发者和运维人员提供稳定、高性能、安全、可靠、开源的操作系统服务。…

Apache Nifi 信息泄露漏洞复现(CVE-2024-56512)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。 0x01 产品描述: Apache NiFi是一个易于使用、功能强大且可靠的数据…

如何运行第一个Tomcat HttpServlet 程序

怀旧网个人博客网站地址:怀旧网,博客详情:如何运行第一个Tomcat HttpServlet 程序 1、编写一个 Servlet 类 创建一个包 在创建一个类--继承HttpServlet 爆红:原因,没有导入所依赖的包 altenter 选着add macen 选着第…

Vue3实现表格搜索内容高亮

采用html拼接 v-html 指令用来将给定的 HTML 字符串直接渲染到页面上 <template><div><!-- 搜索框 --><input v-model"searchText" placeholder"搜索内容" /><!-- 表格 --><el-table :data"tableData" style…

【Excel超实用,VLOOKUP函数,通过excel数据精准匹配,将一个excel文件的某列数据,用另一个excel文件快速填充】

1、使用背景 如下图1所示&#xff0c;1.xlsx文件&#xff0c;有两列数据&#xff0c;一列序号&#xff0c;一列内容&#xff0c; 我现在需要将第二列的内容快速完成填充&#xff0c;并且有相应的excel模板作为参照。 图1 如图2所示&#xff0c;2.xlsx是模板文件&#xff0c;序…

c#删除文件和目录到回收站

之前在c上遇到过这个问题&#xff0c;折腾许久才解决了&#xff0c;这次在c#上再次遇到这个问题&#xff0c;不过似乎容易了一些&#xff0c;亲测代码如下&#xff0c;两种删除方式都写在代码中了。 直接上完整代码&#xff1a; using Microsoft.VisualBasic.FileIO; using Sy…