Storm实时处理的数据流通常来自消息队列系统,
外部独立的分布式消息系统将为实时数据处理系统提供输入流。
Storm Spout会从消息系统读取数据,经过处理后将其转换为tuple,然后再传入storm系统。
有趣的是,storm使用自己内部的分布式消息系统进行nimbus和supervisor之间的通信。
什么是分布式消息系统?
分布式消息系统是基于可靠的消息队列,消息由客户机产生并异步添加到消息系统的消息队列中。分布式消息系统具有高可靠行,可伸缩行和持久化性等优点。
大部分消息系统遵从发布-订阅(Pub-Sub)模型。
发布:消息的发送者被称为消息生产者(publisher),
订阅:消息的接收者称为消息消费者(subscribers).
一旦消息生产者发布消息,消息消费者就可以通过一些过滤操作获取到消息。
通过,有两种消息过滤方式:主题过滤和内容过滤。
主题过滤:topic-based filtering
内容过滤:content-based filtering
需要注意的是,发布-订阅模型只能通过消息进行通信,這是一种非常松耦合的体系结构
甚至消息生产者都不知道谁是消费者。
许多消息模型使用message broker去发布消息,以便能够让消费者及时的获取到消息。
生活中的示例如Dish TV,提供不同的频道(如:运动,电影,音乐等),任何人都可以订阅他们自己喜欢的频道。
下表描述了一些流行的高吞吐量的消息传递系统:
Apache Kafka | Kafka是LinkedIn公司开发的,后来它变成了一个Apache的子项目。Apache kafka是基于brokerenabled、持久、分布式发布-订阅模型。kafka是快速、可伸缩的和高效的。 |
RabbitMQ | RabbitMQ是一个可靠的,开源的分布式消息传递应用程序,易于使用并且支持跨平台。 |
JMS(Java Message Service) | JMS是一个支持创建,读取,跨应用的开源API,提供可靠的消息传递,并且遵从发布-订阅模式。 |
ActiveMQ | ActiveMQ消息传递系统是一个开源JMS API。 |
ZeroMQ | ZeroMQ提供 broker-less对等的信息处理。它提供了push-pull,,router-dealer消息模式 |
Kestrel | Kestrel是一种快速、可靠和简单的分布式消息队列。 |
Thrift Protocol
Thrift是建立在Facebook上的跨语言服务开发和远程过程调用(RPC)协议。
之后,它成为了一个Apache的开源项目。
Apache Thrift是一种接口定义语言,它允许定义新的数据类型,并支持以一个简单的方式在新的数据类型之上添加实现。
Apache Thrift也是一个支持嵌入式系统,移动应用程序、web应用程序和许多其他的编程语言的通信框架。
Thrift具有模块化、灵活性和高性能等特点。
此外,它可以在分布式应用程序中执行streaming, messaging, and RPC 操作。
Storm广泛使用Thrift Protocol协议实现内部通信协议和数据定义。
Storm topology就是简单的Thrift结构。
Storm的nimbus运行topology就是用的是Thtift服务。