1. 引言

Apache Storm处理实时数据,输入通常来自消息队列(message queuing)系统。 外部分布式消息系统将提供实时计算所需的输入。 Spout将从消息系统读取数据并将其转换为Tuple并输入到Apache Storm中。 有趣的事实是,Apache Storm在其内部使用它自己的分布式消息系统来进行NimbusSupervisor之间的通信。

2. 什么是分布式消息系统?

分布式消息传递基于可靠消息队列的概念。 消息在客户端应用程序和消息传递系统之间异步排队。 分布式消息传递系统提供了可靠性,可伸缩性和持久性的好处。

 

大多数消息传递模式遵循发布订阅publish-subscribe)模型(简称Pub-Sub),其中消息的发送者称为发布者(publishers),而想要接收消息的人称为订阅者(subscribers)。

 

一旦发送者发布消息,用户就可以借助过滤选项来接收自己想要的消息。 通常我们有两种类型的过滤,一种是基于主题topic-based)的过滤,另一种是基于内容content-based)的过滤。

 

请注意,pub-sub模型只能通过消息进行通信。 它是一个非常松散耦合的架构; 即使发布者也不知道他们的订阅者是谁。 许多消息模式(pattern)使消息代理(message broker)能够交换发布消息,以便许多订阅者及时访问。 一个真实的例子是Dish TV,它发布体育,电影,音乐等不同的频道,任何人都可以订阅他们自己喜欢的一些频道,并在他们的订阅频道正常工作时观看电视内容。

image.png

下表介绍了一些流行的高吞吐量消息传送系统:

 

分布式消息系统

描述

Apache Kafka

KafkaLinkedIn公司开发的一个消息系统,后来成为Apache的一个子项目。 Apache Kafka基于brokerenabled,持久的分布式发布订阅(publish-subscribe)模型。 Kafka快速,可扩展且高效。

RabbitMQ

RabbitMQ是一款强大的开源的分布式消息应用程序。 它很容易使用并且能在所有平台上运行。

JMSJava Message Service

JMS是一个开放源码的API,支持创建、读取消息,并能从一个应用程序将消息发送到另一个。 它提供有保证的消息传递并遵循发布订阅(publish-subscribe)模型。

ActiveMQ

ActiveMQ消息系统是JMS的一个开源API

ZeroMQ

ZeroMQ是无代理的点对点消息处理系统。 它提供了推拉(push-pull),路由器经销商(router-dealer)消息模式。

Kestrel

Kestrel是一个快速,可靠,简单的分布式消息队列。


3. Thrift协议


ThriftFacebook开发的,用于跨语言服务开发和远程过程调用(RPC)。 后来,它成为了Apache的一个开源项目。 Apache Thrift是一种接口定义语言(Interface Definition Language),允许以简单的方式在定义的数据类型之上定义新的数据类型和服务实现。

 

Apache Thrift也是一个支持嵌入式系统,移动应用程序,Web应用程序和许多其他编程语言的通信框架。 它的一些关键特性是模块化,灵活性和高性能。 另外,它可以在分布式应用程序中执行流式传输,消息传递和RPC

 

Storm广泛使用Thrift协议来进行数据定义, Storm Topology就是一个简单的Thrift Structs,而在Apache Storm中运行TopologyStorm Nimbus是一个Thrift服务(service)。所以Storm支持多种编程语言来编写你的应用。

 

Storm在版本0.9以后,使用 Netty作为内部通信的框架,用Disruptor作为实现技术。

Disruptor一种线程之间信息无锁的交换方式(使用CASCompare And Swap/Set)操作)。



关注微信服务号,手机看文章
关注微信服务号,手机看文章