Python Banyan学习笔记之架构设计

A lightweight, reactive framework used to create flexible, non-blocking, event driven, asynchronous applications.

前言

MrYsLab构建了一个非常有意思的项目python_banyan,该项目基于ZeroMQ. 基于消息为异步编程提供框架。

ZeroMQ非常适合用于构建消息系统,我们此前在codelab-adapter的架构设计中论述过这点。

如果你喜欢将message作为构建世界的积木,ZeroMQ为你开箱提供了很多有用的消息通信模式。

ZeroMQ极为通用,完全有取代socket的能力。networkzeropython_banyan都试图基于ZeroMQ构建更加易用的编程API,因为ZeroMQ的高度灵活性,可能让人一时无从下手。

本文关注Banyan的架构设计。

是什么(翻译:原文

Python Banyan是一个轻量级的反应式(reactive)框架,用于创建灵活、非阻塞、事件驱动的异步应用程序。它主要用于帮助构建Raspberry Pi,ESP8266和Arduino等设备的实时物理计算应用程序,当然也可以轻松用于物理编程领域之外的项目。

Banyan使用 类似于MQTT发布/订阅模型,但在实时控制和数据监视应用程序中比MQTT快得多(codelab-adpater选择ZeroMQ的理由之一也是这个)。官方文档里有一份关于Banyan和MQTT的基准比较用以说明Banyan的效率。如果你的应用程序需要连接到MQTT broker,已经有可用的网关了。

大多数传统的物理计算库或框架使用面向对象的模型,它产生单个、紧耦合的完整可执行映像(image)(耦合于编程语言runtime)。Banyan使用面向对象模型的扩展,称为基于组件的 面向服务的体系结构模型。基于组件的应用程序由一组独立的、松耦合的部件,即通过一组独立于平台的、用户定义的、通过TCP网络发送的协议消息彼此通信。

Banyan应用程序由一组作为单独进程并发运行的组件组成。这些组件可以使用单一语言平台(如Python)开发,也可以使用任何其他Banyan框架开发。有可用于JavaScript、Ruby和Java的Banyan版本。使用不同语言开发的组件可以在不进行修改的情况下进行组合,以形成单一、内聚的应用程序。

Banyan使用称为Backplane的中央消息分发机制。首次启动Banyan应用程序时,Backplane将彼此连接,然后启动应用程序的组件。在启动时,每个组件自动“插入”Backplane,在Backplane之间建立彼此之间的TCP/IP通信通道。

在建立通信之后,组件可以将消息发布到Backplane,从其他组件接收消息或者发布和接收消息。Python Banyan的一个主要特性是它能够无缝轻松地将Numpy数据合并到协议消息中。

无需修改,Banyan应用程序的组件可以在单台计算机上运行,​​也可以分布在多台计算机上。

更多技术细节

Banyan 基类

基类充当ZeroMQ的包装器,该库已配置为以发布/订阅网络模式运行。此外,基类使用MessagePack对协议消息进行编码和解码,以实现高效的网络传输。

Banyan 协议消息

Banyan协议消息由2部分组成, "topic" 和 "payload".

topic

消息的topic只是简单字符串。为了收到消息,你需要订阅相应topic。

前缀匹配: 当你订阅abcd,abcde也会匹配。 默认是前缀匹配吗?(todo)

payload

数据类型是Python字典。

Banyan消息不是特定于计算机语言的,JS中的demo

应用设计

基于Banyan设计应用,最佳实践是保持组件的精简。通过将组件的关注点限制在一个小的范围,大大简化了测试并且增加组件的可重用行。

设计引导

  • 每个组件尽可能订阅少的主题消息。
  • 尽可能保持消息简短。
  • 将组件限制为其手头的任务。例如,如果要记录应用程序的活动,请创建特定的日志记录组件。所有其他组件都可以以一致的方式利用此日志记录工具。

如何使用

如果你对使用Python Banyan这个Python库感兴趣,可以翻阅其文档,完整而清晰.

应用案例

商业上, Python Banyan已经被旧金山的Palace Games选中来监控他们的Palace Games Edison Room(Raspberry Pi Blog)

这儿包含数百个传感器和执行器,Banyan帮助将所有设备及其相关的微控制器连接在一起,使他们能够快速、透明地相互通信。Banyan支持Numpy数据的传输,Edison Room使用这些数据来有效地建模。

Banyan还在利用Raspberry Pi、Arduino和ESP8266的众多物理计算项目中使用。Python Banyan的早期版本,称为razmq,用于控制Raspberry Pi机器人。

参考




Fork me on GitHub