Pulsar 在涂鸦智能的实践

标签: dev | 发表时间:2019-12-09 00:00 | 作者:
出处:http://itindex.net/relian


️ 阅读本文需 7 分钟


作者:张永红,开放平台组研发工程师(涂鸦智能)



>>> 关于涂鸦


涂鸦智能是一个全球化智能平台和“AI+IoT”开发者平台,也是世界排名前列的语音 AI 交互平台。连接消费者、制作品牌、OEM 厂商和零售连锁的智能化需求,为客户提供一站式人工智能物联网的解决方案,并且涵盖了硬件介入、云服务以及 APP 软件开发三方面,形成人工智能+制造业的服务闭环,为消费类 IoT 智能设备提供 B 端技术及商业模式升级服务,从而满足消费者对硬件产品更高的诉求。



上图体现了涂鸦目前的生态模式,包含涂鸦云、涂鸦 OS、涂鸦 APP,形成一个生态闭环。右半部分则为涂鸦涉及到的一些应用场景,例如,智能酒店、智能安防、全屋智能等。

 

>>> 涂鸦的消息系统架构



上图是涂鸦智能之前的消息架构图。上层是一些 IoT 的独立设备,包括智能开关、投影仪等。通过 MQTT 协议,将消息上报给消息系统。还有一部分设备是传感器等,通过 zigbee 网关和 MQTT 协议的传输,最后上报至消息系统。



上图是涂鸦消息系统具体的链路,从 MQTT 网关开始,接入服务连接到 Kafka,通过 Kafka 进行消息的分发。用户在接收到消息后,可以采取不同的处理方式。

 


 

以上的架构模式存在一些业务痛点。

 

1. HTTP 投递方式不灵活,这个是最明显的一个痛点。假如用户的服务挂掉,想在重启后重新进行消费。如果我们想要满足这个需求,就需要对消息的持久化进行额外的处理。

 

2. Kafka topic 数量与日俱增,运维成本高。用户使用 Kafka 订阅模式下,可以解决前文提到的持久化问题,但是随着用户和消息量的增加,Kafka 的运维层面压力会比较大,人力和时间等耗费比较高。

 

3. 租户之间会相互影响。通过架构图可以看出,从 Kafka 模式进行分发后,租户之间会受到很大影响。


 


>>> Pulsar 自身的优势


Apache Pulsar 是灵活的发布-订阅消息系统,采用分层分片架构。 


1. 丰富的投递/订阅策略

Pulsar 做了队列模型和流模型的统一,在 Topic 级别只需保存一份数据,同一份数据可多次消费。以流式、队列等方式计算不同的订阅模型大大提升了灵活度。

    

2. 运维难度小(相比 Kafka),偏向自动化

主要体现在跨地域复制方面。Pulsar 使用计算与存储分离的云原生架构,数据从 Broker 搬离,存在共享存储内部。上层是无状态 Broker,复制消息分发和服务;下层是持久化的存储层 Bookie 集群。


Pulsar 存储是分片的,这种架构可以避免扩容时受限制,实现数据的独立扩展和快速恢复。


3. 多租户隔离优势

租户和命名空间(namespace)是 Pulsar 支持多租户的两个核心概念。

  • 在租户级别,Pulsar 为特定的租户预留合适的存储空间、应用授权与认证机制。

  • 在命名空间级别,Pulsar 有一系列的配置策略(policy),包括存储配额、流控、消息过期策略和命名空间之间的隔离策略。


在社区方面,Pulsar 的线上社区里,用户们都很活跃,不管是技术问题还是文档问题,响应都非常迅速。


>>> 与竞品相比,性能更出色


当然,在决定使用 Apache Pulsar 前,涂鸦也做足了充分的调研,并从性能、缩扩容、运维等角度对比了多个消息队列。

 

 LeviMQ 是涂鸦自己研发的基于 MQTT 协议的消息队列。

 NSQ 是 Go 语言里比较流行的开源消息中间件产品。

首先在扩容上 Kafka 稍显不足,尤其是在缩容时。从运维角度看,Kafka 也如上文提到的,运维过程对人力和时间的消耗较多。最后在生态方面,因为 LeviMQ 是涂鸦自研的系统并且没有开源,所以生态上具有一定的局限性。

 

在各性能对比后,也从单个产品角度分析了各个消息队列的优缺点,如下图所示。



从上图可以看出,Pulsar 在扩容和应用场景方面会更出色一些,相比较而言也比 Kafka 更灵活一点。

 

当然,关于参考资料少的情况,Pulsar 社区也在一直努力在填补这些缺失,最近新增了不少文档。

 

>>> 测试结果


使用 Apache Pulsar 后,涂鸦的消息系统架构发生了变化,如下图所示:



架构有以下变化:


1. 从 Kafka 到消息分发中,加了一层 Pulsar 结构。在这个架构下,最明显的提升就是解决了租户隔离的问题。在进行 Pulsar 部署时,为每个用户在 Pulsar 里新建了一个租户。

 

2. 投递给用户的方式中新加了 Pulsar 的传递方式,可以直接使用涂鸦的 SDK 去订阅 Pulsar 的消息。




在尝试使用 Pulsar 的这段时间里,涂鸦的消息系统运作效率比之前有了很大的提升。但是在使用过程中,也出现了一些 bug,比如消息堆积、消费重复等现象。当然涂鸦也对此采取了一些措施。以下为实践案例:


>>> 消息堆积 


  • 问题描述

使用过程中的一个消费者,服务运行一段时间后,出现消息堆积。但是查看日志发现没有报错情况,选择重启后,恢复正常。一段时间后,消息堆积情况再次出现。

 

  • 原因描述

导致该问题的原因是 flow 计数机制。

 

Kafka 是推拉模型结合,Client 去 flow 了多少条数据,Pulsar 会在消息到了的时候,往里推多少数据。如果这个时候,不去 flow 数据,Pulsar 不会再去 Client 推送数据。



Go client 的代码中有计数机制(红框)。计数机制会循环使用,并执行红框里的内容。

 

但是在使用时,不知是网络问题还是 Apache Pulsar 的 broker 问题,比如拉取了 10 条,却只反馈了 8 条。这会导致下一次的 flow 永远不会触发。这时生产者一直往上推送消息,消息就会一直堆在 Pulsar 里。

 

  • 解决措施



解决措施是:定时发送 flow 指令,即每隔 30s,flow 一些数据过来。这样做的额外成本是会增加一些定时器。如果 topic 数量少,这个定时器成本还在承受范围内。但如果 topic 数量过多,大量的定时器会导致 CPU 的压力很大。




>>> 解析紊乱


  • 问题描述



上图所示,上部分是 Java 发的,下部分是 Go 接收的。通过对比可以看出:下方多了一个回车、一些空格,以及制表符。



上图中 Java 发送了四遍 "hello pulsar",下方在 "hello pulsar" 前边多了个 `3`。



最后我们发送 "hello",输出正常。但仍然发现有部分字节码是有点问题的。

 

  • 原因描述

Java Client 在默认发送时,有一个 batch 参数默认为 `true`。解析 batch message 时,发现其 payload 里有一个复合结构,是个数组。


P1 是 metadataSize,表示后边字节有几个。

P2 里的 24 和 5 是它的 meta 信息。

P3 中 5 表示后边的 5 位才是真实的 payload。




>>> 消息重复消费


  • 问题描述

消费者服务是通过 failover 模式去订阅 Pulsar。在此订阅模式下,某个 topic 下新加入的消费者有几率成为 active 状态。此时旧的消费者可能还有一部分消息还未消费完。如果没做相应处理,部分消息就会被新旧消费者同时消费。


如图所示,从 M3 到 M6,左边的在消费,右边的也在消费。

 

  • 解决措施


Pulsar 有一个接口,初始化 Consumer 时,有个 Consumer list,在消费者变化时,从活跃变成不活跃、不活跃变成活跃,都能收到消息。对这些消息做监听然后进行处理,虽然这种情况下也会出现消费重复的 bug,但是概率很小。 



 

Apache Pulsar 现已应用在涂鸦智能的各应用层,总体表现不错。涂鸦也对 Pulsar 的使用有一些规划和期望。

 

>>> 规划
  • 持续引导客户使用 Pulsar 的消息推送模式,取代之前的 HTTP 和 Kafka。

  • 结合 Pulsar 实现一套规则引擎,满足日益丰富的消息订阅需求。

 

>>> 期望

除了上文提到的实践效果外,涂鸦也希望在未来的业务支撑中,Apache Pulsar 能有更多扩展的功能,提供更加丰富的使用场景,所以也对 Pulsar 提出了一些的期望。


  • 在技术层面,希望添加更多运维 API,比如查看某个 topic 所属的 broker 和 bookie。

  • 在文档层面,希望官方多发布一些 Pulsar 设计文档,帮助更多用户充分了解 Pulsar。

 



伴随着 5G 的到来,IoT 行业迎来了一系列挑战和机遇。涂鸦智能作为一个全球化智能平台,除了在链接各个销售平台厂商外,也与用户之间有着千丝万缕的联系功能。在主打「万物智能」主题的背后,涂鸦也在寻找极高的性能与稳定性的消息系统。


在经过对比诸多消息系统(例如 Kafka 和 LeviMQ)后,涂鸦选择了性能出色的 Apache Pulsar,也通过 Pulsar 的跨地域复制、多租户隔离等特性,解决了之前消息系统中的诸多痛点问题,例如,投递不灵活、topic 数量增加和租户互相影响等,进一步证明了 Apache Pulsar 在 IoT 行业的应用前景十分可观。



  

查看更多 Pulsar 用户案例:

相关 [pulsar 涂鸦 智能] 推荐:

Pulsar 在涂鸦智能的实践

- - IT瘾-dev
作者:张永红,开放平台组研发工程师(涂鸦智能). 涂鸦智能是一个全球化智能平台和“AI+IoT”开发者平台,也是世界排名前列的语音 AI 交互平台. 连接消费者、制作品牌、OEM 厂商和零售连锁的智能化需求,为客户提供一站式人工智能物联网的解决方案,并且涵盖了硬件介入、云服务以及 APP 软件开发三方面,形成人工智能+制造业的服务闭环,为消费类 IoT 智能设备提供 B 端技术及商业模式升级服务,从而满足消费者对硬件产品更高的诉求.

街头涂鸦

- Kidwind - 玩意儿
之前介绍过很多 3D 街头涂鸦了作品了,今天这些是德国艺术家 Manfred Stader 的作品. 本文原始链接:http://www.cngadget.cn/3d-street-art.html. 滑稽的街头艺术,我们没看到的创意.

Apache Pulsar 在 BIGO 的性能调优实战(上)

- - IT瘾-dev
️ 阅读本文大约需要 10 分钟. 在人工智能技术的支持下,BIGO 基于视频的产品和服务受到广泛欢迎,在 150 多个国家/地区拥有用户,其中包括 Bigo Live(直播)和 Likee(短视频). Bigo Live 在 150 多个国家/地区兴起,Likee 有 1 亿多用户,并在 Z 世代中很受欢迎.

Pulsar:下一代消息引擎真的这么强吗?

- - 掘金 后端
我们最近在做新业务的技术选型,其中涉及到了对消息中间件的选择;结合我们的实际情况希望它能满足以下几个要求:. 友好的云原生支持:因为现在的主力语言是. Go,同时在运维上能够足够简单. 最好是有一些方便好用的特性,比如:延时消息、死信队列、多租户等. 当然还有一些水平扩容、吞吐量、低延迟这些特性就不用多说了,几乎所有成熟的消息中间件都能满足这些要求.

[译] 雅虎日本如何用 Pulsar 构建日均千亿的消息平台

- - IT瘾-dev
雅虎日本是一家雅虎和软银合资的日本互联网公司,是日本最受欢迎的门户网站之一. 雅虎日本的互联网服务在日本市场占主导地位. 下图从三个维度显示了雅虎日本的经营规模. 第一个是服务数量,雅虎日本提供上百种互联网服务;第二个是服务器数量,雅虎日本使用超过 150,000 台服务器(大多为裸机服务器)全天候支持这上百种互联网服务的正常运作;第三个是每月总页面浏览量,2017 年的数据显示,雅虎日本每月浏览量超过 700 亿.

ABSOLUT Glimmer: 光涂鸦锋潮

- Antonin - {看得見風景的房間}
绝对伏特加 是全球销量最大的高档烈酒品牌之一,也是世界排名第一的高档伏特加品牌. 从 2005年开始,绝对伏特加推出了一系列新颖独特的促销包装设计和限量版产品,以无可抵挡的时尚风潮席卷世界并备受赞叹.   2010年开始绝对伏特加尝试更多和国内创意人/创意机构进行合作,使得其更具艺术感,更富收藏价值.

Darius twin 光涂鸦又一波

- gloomy - 设计|生活|发现新鲜
Light paintings from Darius twin,一幅幅精彩绝伦的光涂鸦摄影让人叹为观止. 「设计,生活,发现新鲜」在新浪微博,更即时地获读更新,更直接地交流沟通. © 设计|生活|发现新鲜 | 原文链接 | 投稿 ! | 新浪微博 | 逛逛我们的在线商店. Twin Bookshelf: 一组漂亮的书架(书柜.

二维条码——终极内涵涂鸦

- Zane - DIY - 果壳网
DIYer:AwkwardEngineer 制作时间:半小时 制作难度:★★☆☆☆ GEEK指数:★★★★☆. 首先,欢迎访问我的网站 AwkwardEngineer. 二维条码的确很有爱,它们不应该只是呆在书皮上和火车票的角落里,它们应该走上大街,走向艺术. 另外,任何一个随身携带智能手机的谢耳朵都会在你的涂鸦面前驻足欣赏,嘿嘿,他们可受不了不去扫条码呢.

MOMO留学花絮(1)涂鸦接龙

- Helo Wei - 【自得其乐】
最近上音频课都和Natalya画小人了,哈哈哈这姑娘我喜欢~上次她画的我躺地上那张忘在教室被老师捡到了,老师还特意问是谁的.

涂鸦接龙Momo VS Natalya(2)

- MaoDou - 【自得其乐】
这周音频课上画的~好吧音频课实在太无聊了. 起因是我因为前一天熬夜困得生不如死,Natalya就画了一杯咖啡,然后我画个牌子写上Drug~. 黑色笔是Natalya蓝色笔是我. 最后一张她还把男主角画成很疲惫的样子.