Storm - 分布式消息系统
Apache Storm 处理实时数据,输入通常来自消息队列系统。 外部分布式消息传递系统将提供实时计算所需的输入。 Spout 将从消息系统中读取数据并将其转换为元组并输入到 Apache Storm。 有趣的事实是 Apache Storm 在内部使用自己的分布式消息传递系统来实现其 nimbus 和主管之间的通信。
什么是分布式消息系统?
分布式消息传递基于可靠消息队列的概念。 消息在客户端应用程序和消息传递系统之间异步排队。 分布式消息传递系统提供了可靠性、可伸缩性和持久性的好处。
大多数消息传递模式都遵循 发布-订阅 模型(简称为 Pub-Sub),其中消息的发送者称为 发布者,而想要接收消息的人称为 订阅者。
发送者发布消息后,订阅者可以在过滤选项的帮助下接收选定的消息。 通常我们有两种过滤方式,一种是基于主题的过滤,另一种是基于内容的过滤。
请注意,发布-订阅模型只能通过消息进行通信。 它是一个非常松耦合的架构; 甚至发件人也不知道他们的订阅者是谁。 许多消息模式使消息代理能够交换发布消息,以便许多订阅者及时访问。 一个真实的例子是 Dish TV,它发布不同的频道,如体育、电影、音乐等,任何人都可以订阅自己的频道集,并在他们订阅的频道可用时获取它们。
下表描述了一些流行的高吞吐量消息传递系统 −
分布式消息系统 | 说明 |
---|---|
Apache Kafka | Kafka 是在 LinkedIn 公司开发的,后来成为 Apache 的一个子项目。 Apache Kafka 基于支持代理的、持久的、分布式的发布-订阅模型。 Kafka 快速、可扩展且高效。 |
RabbitMQ | RabbitMQ 是一个开源的分布式健壮消息传递应用程序。 它易于使用并在所有平台上运行。 |
JMS(Java Message Service) | JMS 是一种开源 API,支持从一个应用程序创建、读取和发送消息到另一个应用程序。 它提供有保证的消息传递并遵循发布-订阅模型。 |
ActiveMQ | ActiveMQ 消息系统是 JMS 的一个开源 API。 |
ZeroMQ | ZeroMQ 是无代理的点对点消息处理。 它提供推拉式、路由器-经销商消息模式。 |
Kestrel | Kestrel 是一个快速、可靠且简单的分布式消息队列。 |
Thrift 协议
Thrift 是 Facebook 为跨语言服务开发和远程过程调用 (RPC) 而构建的。 后来,它成为了一个开源的 Apache 项目。 Apache Thrift 是一种接口定义语言,允许在定义的数据类型之上以简单的方式定义新的数据类型和服务实现。
Apache Thrift 也是一个支持嵌入式系统、移动应用程序、Web 应用程序和许多其他编程语言的通信框架。 与 Apache Thrift 相关的一些关键特性是其模块化、灵活性和高性能。 此外,它还可以在分布式应用程序中执行流式传输、消息传递和 RPC。
Storm 广泛使用 Thrift 协议进行内部通信和数据定义。 Storm topology 只是 Thrift Structs。 在 Apache Storm 中运行 topology 的 Storm Nimbus 是一个 Thrift 服务。