发布订阅消息系统Apache Pulsar简介

本文由 【 AI前线】原创,原文连接: t.cn/RTzihsu


AI 前线导读:Apache Pulsar(孵化器项目)是一个企业级的发布订阅(pub-sub)消息系统,最初由 Yahoo 开发,并于 2016 年末开源,如今是 Apache 软件基金会的一个孵化器项目。Pulsar 在 Yahoo 的生产环境运行了三年多,助力 Yahoo 的主要应用,如 Yahoo Mail、Yahoo Finance、Yahoo Sports、Flickr、Gemini 广告平台和 Yahoo 分布式键值存储系统 Sherpa。微信


Pulsar 相关概念和术语网络

向 Pulsar 发送数据的应用程序叫做生产者(producer),而从 Pulsar 读取数据的应用程序叫做消费者(consumer)。有时候消费者也被叫做订阅者。主题(topic)是 Pulsar 的核心资源,一个主题能够被当作是一个通道,消费者向这个通道发送数据,消费者从这个通道拉取数据。架构

运维

                                                图 1:生产者、消费者和主题分布式

构建 Pulsar 的目的是为了支持多租户(multi-tenant)应用场景。Pulsar 的多租户机制包含了两种资源:资产(property)和命名空间(namespace)。资产表明系统里的租户。假设有一个 Pulsar 集群用于支持多个应用程序(就像 Yahoo 那样),集群里的每一个资产能够表明一个组织的团队、一个核心的功能或一个产品线。一个资产能够包含多个命名空间,一个命名空间能够包含任意个主题。函数

                                          图 2:Pulsar 各个组件间的关系工具

命名空间是 Pulsar 最基本的管理单元。在命名空间层面,咱们能够设置权限、调整复制选项、管理跨集群的数据复制、控制消息的过时时间或执行其余关键任务。命名空间里的主题会继承命名空间的配置,因此咱们能够一次性对同一个命名空间内的全部主题进行配置。命名空间能够分为两种:性能

  • 本地(local)——本地命名空间只在集群内可见。spa

  • 全局(global)——命名空间对多个集群可见,能够是同一个数据中心内的集群,也能够是跨地域数据中心的集群。该功能取决因而否启用了集群复制功能。命令行

虽然本地命名空间和全局命名空间的做用域不一样,但它们均可以在不一样的团队或不一样的组织内共享。若是应用程序得到了命名空间的写入权限,就能够往该命名空间内的全部主题写入数据。若是写入的主题不存在,就会建立该主题。

每一个命名空间能够包含一到多个主题,每一个主题能够有多个订阅者,每一个订阅者能够接收全部发布到该主题的消息。为了给应用程序提供更大的灵活性,Pulsar 提供了三种订阅类型,它们能够共存在同一个主题上:

  • 独享(exclusive)订阅——同时只能有一个消费者。

  • 共享(shared)订阅——能够由多个消费者订阅,每一个消费者接收其中的一部分消息。

  • 失效备援(failover)订阅——容许多个消费者链接到同一个主题上,但只有一个消费者可以接收消息。只有在当前消费者发生失效时,其余消费者才开始接收消息。

图 3 展现了这三种类型的订阅。Pulsar 的订阅机制解耦了消息的生产者和消费者,在不增长复杂性和开发工做量的状况下为应用程序提供了更大的弹性。

                                             图 3:不一样类型的 Pulsar 订阅

数据分区

写入主题的数据可能只有几个 MB,也有多是几个 TB。因此,在某些状况下主题的吞吐量很低,有时候又很高,彻底取决于消费者的数量。那么碰到有些主题吞吐量很高而有些又很低的状况该怎么处理?为了解决这个问题,Pulsar 将一个主题的数据分布到多台机器上,也就是所谓的分区。

在处理海量数据时,为了保证高吞吐量,分区是一种很常见的手段。默认状况下,Pulsar 的主题是不进行分区的,但经过命令行工具或 API 能够很容易地建立分区主题,并指定分区的数量。

在建立好分区主题以后,Pulsar 能够自动对数据进行分区,不会影响到生产者和消费者。也就是说,一个应用程序向一个主题写入数据,对主题分区以后,不须要修改应用程序的代码。分区只是一个运维操做,应用程序不须要关心分区是如何进行的。

主题的分区操做由一个叫做 broker 的进程来处理,Pulsar 集群里的每一个节点都会运行本身的 broker。



                                       图 4:将一个主题分到多个 broker 上

主题分区不会影响到应用程序,除此以外,Pulsar 还提供了几种消息路由策略,帮助咱们更好地跨分区、跨消费者分布数据。

  • 单个分区——生产者随机挑选一个分区,并将数据写入该分区。该策略与非分区主题提供的保证是同样的,不过若是有多个生产者向同一个主题写入数据,该策略就会颇有用。

  • 轮询(round robin)分区——生产者经过轮询的方式将数据平均地分布到各个分区上。好比,第一个消息写入第一个分区,第二个消息写入第二个分区,并以此类推。

  • 哈希(hash)分区——每一个消息会带上一个键,要写入哪一个分区取决于它所带的键。这种分区方式能够保证次序。

  • 自定义分区——生产者使用自定义函数生成分区对应的数值,而后根据这个数值将消息写入对应的分区。


持久性

Pulsar broker 在收到消息并进行确认以后,就必须确保消息在任何状况下都不会丢失。与其余消息系统不一样的是,Pulsar 使用 Apache BookKeeper 来保证持久性。BookKeeper 提供了低延迟的持久化存储。Pulsar 在收到消息以后,将消息发送给多个 BookKeeper 节点(具体由复制系数来定),节点将数据写入预写式日志(write ahead log),同时在内存里也保存一份。节点在对消息进行确认以前,强制将日志写入到持久化的存储上,所以即便出现电力故障,数据也不会丢失。由于 Pulsar broker 将数据发给了多个节点,因此只会在大多数节点(quorum)确认写入成功以后它才会将确认消息发给生产者。Pulsar 就是经过这种方式来保证即便在出现了硬件故障、网络故障或其余故障的状况下仍然可以保证数据不丢失。在后续的文章中,咱们将深刻探讨这方面的细节。


生产环境实践

Pulsar 目前在助力 Yahoo 的主要应用,如 Yahoo Mail、Yahoo Finance、Yahoo Sports、Gemini 广告平台和 Yahoo 分布式键值存储系统 Sherpa。不少场景都要求很强的持久性保证,好比零数据丢失,同时又要求很高的性能。Pulsar 从 2015 年开始部署到生产环境,如今在 Yahoo 的生产环境里大规模地运行。

  • Pulsar 被部署在 10 多个数据中内心,具有了全网格复制能力

  • 天天处理超过 1000 亿个消息

  • 支持着 140 万个主题

  • 总体的消息发布延迟小于 5 毫秒


总结

在这篇文章里,咱们简单介绍了 Apache Pulsar 的一些概念,并解释了 Pulsar 是如何经过在发送确认消息前提交数据来保证持久性的,以及经过分区来提升吞吐量,等等。在后续的文章中,咱们将深刻探讨 Pulsar 的总体架构和特性细节,咱们也将提供一些指南教你们如何更好地使用 Pulsar。

查看英文原文:streaml.io/blog/intro-…

关注咱们的微信号"AI前线",后台回复“AI”可得到《AI前线》系列PDF电子书