分布式消息队列中间件系列研究之阿堂教程(基础篇-Local模式)

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
性能测试 PTS,5000VUM额度
简介:

 了考虑web架构的伸缩性,扩展性及重用性,目前许多大型门户网站及大平台,如淘宝网,天猫网,京东商城,当当网,及腾讯,Facebook等电商或社交网站,均大量采用中间件的设计,中间件又细分为业务流中间件,服务中间件,消息队列中间件,缓存中间件,数据库中间件,可以这样说,中间件在整个web架构设计中占有十分重要的地位,中间件设计的好坏直接影响到大型门户网站架构水平的高低和优劣。由于时间和精力的关系,这里阿堂主要是分享下对消息队列中间件的应用认识和理解。

消息中间件在web分布式架构设计及性能优化方面有着非常重要的地位,目前,在很多大型网门户网站和商业大平台都有及为广泛的应用,如淘宝网,天猫网,京东商城,当当网,及腾讯,Facebook等电商或社交网站,都在大量使用。常见的开源消息中间件有mom4j,OpenJMS,UBerMQ,Hermes JMS, Presumo,JORAM,JMS4Spread,Open Message Queue,FFMQ,MQSSave/MQSLoad,HornetQ,Apache Qpid,Spring AMQP,Kafka,play-rabbitmq,队列消息系统 FQueue,ActiveMQ,Somnifugi ,MantaRay,MetaQ等。关于它们的差异和作用,在网上有相应的介绍,这里阿堂就不再说明了。有兴趣的网友们可以自行去研究。

今天阿堂,主要和大家分享研究的是对Metaq这款分布式消息中间件的应用。

MetaQ(全称Metamorphosis)是一个高性能、高可用、可扩展的分布式消息中间件,思路起源于LinkedIn的Kafka,但并不是Kafka的一个Copy。MetaQ具有消息存储顺序写、吞吐量大和支持本地和XA事务等特性,适用于大吞吐量、顺序消息、广播和日志数据传输等场景,目前在淘宝和支付宝有着广泛的应用。


MetaQ是一款完全的队列模型消息中间件,服务器使用Java语言编写,可在多种软硬件平台上部署。客户端支持Java、C++编程语言。单台服务器可支持1万以上个消息队列,通过扩容服务器,队列数几乎可任意横向扩展。每个队列都是持久化、长度无限(取决于磁盘空间大小)、并且可从队列任意位置开始消费。

它具有的优势如下

(1)文本协议设计,非常透明,支持类似memcached stats的协议来监控broker。
(2)纯Java实现,从通讯到存储,从client到server都是重新实现。
(3)提供事务支持,包括本地事务和XA分布式事务。
(4)支持HA复制,包括异步复制和同步复制,保证消息的可靠性。
(5)支持异步发送消息。
(6)消费消息失败,支持本地恢复。
(7)多种offset存储支持,数据库、磁盘、zookeeper,可自定义实现。
(8)支持group commit,提升数据可靠性和吞吐量。(目前kafka已实现)
(9)支持消息广播模式。
(10)一系列配套项目:Python/Ruby/C/C++客户端、Twitter Storm的Spout、Tail4j等。


关于消息队列应用的场景,实际上在商业应用中很多网站都在大量应用。阿堂这里随更举几个例子,大家就明白了。12306铁路购票网站,想必大家耳熟能详,去年及以前由于12306网站架构设计不好,经常出现网站并发访问量大时出现网站崩溃,提示服务出错或者说网站根本登录不进去,或者说抢到票时提交没有反应了。今年12306抢票网站就采用“消息队列中间件”来重构了12306网站,采用消息队列的排队机制,抢票时会提示“只有多少张票,目前已经有多少人在排队抢购了,票源不足”,比如说某车次只有10张票了,你前面已经有11人排队抢票了,当然输到你时就没有票了。这样一方面可以缓冲瞬时大量的高并发访问购票,二来对用户来说体验也比较好,因为人家是在你前面排队了,先来先得嘛。还有小米官网抢购手机时,也是用的这种“消息队列中间件”设计,先抢先得。还有一些电商平台的“秒杀抢购”,都是在使用“消息队列中间件”来设计的web架构,这样就可以解决瞬时涌入的大量高并发访问造成的网站压力。看到上面阿堂的举例,大家应该对“消息队列中间件”在大型网站中的重要性有了一个比较感官的认识了。

为了了解MetaQ的使用,下面让我们先要了解和理解其中的一些重要概念解释。

消息生产者
也称为Message Producer,一般简称为producer,负责产生消息并发送消息到meta服务器。
消息消费者
也称为Message Consumer,一般简称为consumer,负责消息的消费,meta采用pull模型,由消费者主动从meta服务器拉取数据并解析成消息并消费。
Topic
消息的主题,由用户定义并在服务端配置。producer发送消息到某个topic下,consumer从某个topic下消费消息。
分区(partition)
同一个topic下面还分为多个分区,如meta-test这个topic我们可以分为10个分区,分别有两台服务器提供,那么可能每台服务器提供5个分区,假设服务器id分别为0和1,则所有分区为0-0、0-1、0-2、0-3、0-4、1-0、1-1、1-2、1-3、1-4。
分区跟消费者的负载均衡机制有很大关系,具体见集群和负载均衡。
Message
消息,负载用户数据并在生产者、服务端和消费者之间传输。
Broker
就是meta的服务端或者说服务器,在消息中间件中也通常称为broker。
消费者分组(Group)
消费者可以是多个消费者共同消费一个topic下的消息,每个消费者消费部分消息。这些消费者就组成一个分组,拥有同一个分组名称,通常也称为消费者集群
Offset
消息在broker上的每个分区都是组织成一个文件列表,消费者拉取数据需要知道数据在文件中的偏移量,这个偏移量就是所谓offset。Offset是绝对偏移量,服务器会将offset转化为具体文件的相对偏移量。详细内容参见#消息的存储结构


为了说明metaq的使用,阿堂附上一个测试demo与大家分享,关于集群模式,阿堂会在下篇文章中继续分享


下面是阿堂在Local单机模式的测试效果图

1.安装,启动zookeeper

分布式消息队列中间件系列研究之阿堂教程(基础篇-Local模式)

2.安装启动metaq服务器

分布式消息队列中间件系列研究之阿堂教程(基础篇-Local模式)

3.在myeclipse编写代码测试

分布式消息队列中间件系列研究之阿堂教程(基础篇-Local模式)

分布式消息队列中间件系列研究之阿堂教程(基础篇-Local模式)

测试代码如下

public class Productor {

public static void main(String[] args) throws Exception {
final MetaClientConfig metaClientConfig = new MetaClientConfig();
final ZKConfig zkConfig = new ZKConfig();
zkConfig.zkConnect = "192.168.1.101:2181";
metaClientConfig.setZkConfig(zkConfig);
MessageProducer producer = sessionFactory.createProducer();
final String topic = "test";
producer.publish(topic);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = "网络时空(阿堂)";
while ((line = reader.readLine()) != null) {
// send message
SendResult sendResult = producer.sendMessage(new Message(topic, line.getBytes()));
// check result
if (!sendResult.isSuccess()) {
System.err.println("Send message failed,error message:" + sendResult.getErrorMessage());
}
else {
System.out.println("Send message successfully,sent to " + sendResult.getPartition());
//System.out.println("分区="+sendResult.getPartition().getPartition());
//System.out.println("broker="+sendResult.getPartition().getBrokerId());
}
}
}

}

---------------------------------------------------------------

public class Consumer {

public static void main(String[] args) throws Exception {
final MetaClientConfig metaClientConfig = new MetaClientConfig();
final ZKConfig zkConfig = new ZKConfig();
zkConfig.zkConnect = "192.168.1.101:2181";
metaClientConfig.setZkConfig(zkConfig);
MessageSessionFactory sessionFactory = new MetaMessageSessionFactory(metaClientConfig);
final String topic = "test";
final String group = "meta-example";

MessageConsumer consumer = sessionFactory.createConsumer(new ConsumerConfig(group));

consumer.subscribe(topic, 1024 * 100, new MessageListener() {
public void recieveMessages(Message message) {
System.out.println("Receive message " + new String(message.getData()));
//System.out.println("分区 = "+message.getPartition().getPartition());
//System.out.println("broker = "+message.getPartition().getBrokerId());
}

public Executor getExecutor() {
return null;
}
});

consumer.completeSubscribe();
}

}


本文转自 www19 51CTO博客,原文链接:http://blog.51cto.com/doujh/1715274,如需转载请自行联系原作者

相关文章
|
4天前
|
JavaScript 前端开发 中间件
深入浅出Node.js中间件模式
【9月更文挑战第13天】本文将带你领略Node.js中间件模式的魅力,从概念到实战,一步步揭示如何利用这一强大工具简化和增强你的Web应用。我们将通过实际代码示例,展示中间件如何在不修改原有代码的情况下,为请求处理流程添加功能层。无论你是前端还是后端开发者,这篇文章都将为你打开一扇通往更高效、更可维护代码的大门。
|
5天前
|
设计模式 缓存 中间件
深入理解PHP中的中间件模式
【9月更文挑战第12天】本文旨在通过浅显易懂的语言和实际代码示例,引导读者了解PHP中如何实现和使用中间件模式,以及这一设计模式如何优化我们的应用程序结构。文章将逐步介绍中间件的概念、在PHP中的应用实例,以及如何自定义中间件来解决实际问题。
|
20天前
|
中间件 PHP 开发者
深入理解PHP中的中间件模式
【8月更文挑战第29天】本文旨在通过探讨PHP中间件模式的实现,帮助读者掌握如何构建可扩展且易于维护的应用。文章不仅解释了中间件概念,还提供了代码示例,并分析了其优势和应用场景。阅读本文后,你将能够更有效地使用中间件来优化你的PHP项目结构。
|
18天前
|
设计模式 JavaScript 中间件
探索PHP中的中间件模式
【8月更文挑战第31天】本文将带你领略PHP编程世界中的“交通枢纽”——中间件模式。我们将从中间件的概念出发,逐步深入到如何在PHP项目中实现并应用这一设计模式。通过实际代码示例,你将学会如何构建自己的中间件,以及如何利用它们来简化项目结构、增强代码可读性和可维护性。准备好了吗?让我们一起走进PHP中间件的世界,解锁更多可能!
|
20天前
|
存储 分布式计算 算法
探索Hadoop的三种运行模式:单机模式、伪分布式模式和完全分布式模式
在配置Hadoop集群之前,了解这三种模式的特点、适用场景和配置差异是非常重要的。这有助于用户根据个人需求和资源情况,选择最适合自己的Hadoop运行模式。在最初的学习和开发阶段,单机模式和伪分布式模式能为用户提供便利和成本效益。进而,当用户要处理大规模数据集时,完全分布式模式将是理想的选择。
49 2
|
18天前
|
设计模式 缓存 中间件
深入理解PHP中的中间件模式
【8月更文挑战第31天】 在PHP开发中,中间件模式是一种优雅的架构设计,它允许开发者以非侵入式的方式扩展应用程序的功能。本文将通过一个简单的示例,展示如何在PHP中实现和使用中间件,以及这种模式如何提高代码的可维护性和可测试性。
|
18天前
|
开发者 云计算 数据库
从桌面跃升至云端的华丽转身:深入解析如何运用WinForms与Azure的强大组合,解锁传统应用向现代化分布式系统演变的秘密,实现性能与安全性的双重飞跃——你不可不知的开发新模式
【8月更文挑战第31天】在数字化转型浪潮中,传统桌面应用面临新挑战。本文探讨如何融合Windows Forms(WinForms)与Microsoft Azure,助力应用向云端转型。通过Azure的虚拟机、容器及无服务器计算,可轻松解决性能瓶颈,满足全球用户需求。文中还提供了连接Azure数据库的示例代码,并介绍了集成Azure Storage和Functions的方法。尽管存在安全性、网络延迟及成本等问题,但合理设计架构可有效应对,帮助开发者构建高效可靠的现代应用。
14 0
|
18天前
|
设计模式 中间件 测试技术
深入理解PHP中的中间件模式
【8月更文挑战第31天】 在软件开发的海洋里,设计模式犹如灯塔指引着开发者的方向。本文将带你驶向一个特别的岛屿——PHP中间件模式,探索它如何简化代码、增强可读性与可维护性。我们将通过实际编码示例,展示如何在PHP中实现中间件模式,并讨论其对项目架构的影响。准备好了吗?让我们启航吧!
|
18天前
|
设计模式 中间件 PHP
深入理解PHP中的中间件模式
【8月更文挑战第31天】本文旨在通过深入浅出的方式,向读者展示如何在PHP中实现和利用中间件模式来增强代码的可维护性和扩展性。文章将介绍中间件模式的基本概念、核心价值以及如何将其应用于PHP项目。我们将从一个简单的例子出发,逐步构建起一个灵活且强大的中间件系统。无论你是PHP新手还是资深开发者,这篇文章都将为你提供新的视角和实用工具,让你的项目更加健壮和易于管理。
|
20天前
|
设计模式 中间件 PHP
探索PHP中的中间件模式
【8月更文挑战第29天】在软件开发的广阔天地中,设计模式犹如建筑的蓝图,为代码的结构与交互提供了指导。本文将深入探讨PHP语言中实现中间件模式的方法,旨在通过实际代码示例,揭示这一模式如何优化项目结构、提高代码可维护性与扩展性。文章不仅阐述中间件模式的概念和重要性,还将展示如何在PHP项目中有效应用该模式,帮助开发者构建更加灵活且易于管理的应用。