支持插件的消息中间件【msg broker with plugin】知然博客园

支持插件的消息中间件【msg broker with plugin】知然博客园,第1张

支持插件消息中间件【msg broker with plugin】 - 知然 - 博客园

支持插件的消息中间件【msg broker with plugin】

支持插件的消息中间件

msg broker with plugin

Msg Broker概念:

msg broker是实现application 之间互通讯的组件。通常为实现application之间的解耦,消息都是通过msg broker完成转发。application只需知道其他applicatipn的逻辑名称,而不需要知道对方的具体位置。Broker中维护一个查找表,记录着哪个application注册在此逻辑名称之下,所以消息总是会被正确的投递到目的地。

msg broker不限于1-1的转发,也支持1-N的模式。其主要功能有:

  1. 实现多个application的互通讯,而隐藏彼此的位置
  2. 实现消息个格式的转换,如json to bin
  3. 安全控制,msg broker可以再转发消息前进行一定程度的安全验证
  4. 增大系统的可伸缩性,由于application通讯的目标变成了逻辑结点,而该逻辑结点可以对应多个物理结点,理论上可以动态的增加物理结点,来扩展该逻辑结点的吞吐量。
  5. msg broker可以用来集成服务,并且可以暴楼服务的部分接口
 msg broker 具有的缺点是:
  1. 增加了复杂性,多了一层转发
  2. 可维护性降低,需要理清msg broker和各个application和服务的关系。
  3. 降低性能,主要是实时性能下降了,消息需要多转发一边,单次请求的延时大大增加了。
当前流行的Broker的特点和缺点:

Msg Broker的结构:

流行的Broker中间件介绍:
  1. RabbitMQ

项目地址:http://www.rabbitmq.com/

RabbitMQ是由Erlang开发的以高效、健壮以及高度伸缩性的消息服务器。其所包含的概念有Producer、Consumer、Exchange、Queue。RabbitMQ基于QMQP协议,支持的语言也非常丰富,文档也非常清晰。使用RabbitMQ可以实现订阅发布模型、RPC模型、路由模型等,参见RabbitMQ的例子:http://www.rabbitmq.com/getstarted.html。

但是它有如下局限性:

  • RabbitMQ 没有针对连接做控制,它是为高效而生,它对外来的请求是信任的,不存在安全验证,如任何一个client都可以创建消息队列,所以RabbitMQ一定是放在内网的。
  • 使用RabbitMQ ,我们是通过Client远程 *** 作RabbitMQ,不能定制RabbitMQ的功能。
  1. ZeroMQ

项目地址:http://www.zeromq.org/

ZeroMQ是一个Socket封装库,号称是最快的消息内核。ZeroMQ可以支持TCP、UDP、IPC等多种通讯协议。ZeroMQ可以实现的通讯模型就更多了,几乎涵盖了消息通讯的所有模式,参见官网介绍http://www.zeromq.org/intro:read-the-manual 。

其局限性为:

  • ZeroMQ虽然封装了消息传输的复杂性,但是它也隐藏了连接的建立、断开等过程。ZeroMQ传输消息更像是udp数据报,使用者不能知道对方何时连接建立、何时连接断开。
我们需要一个不一样的Broker应用场景介绍

在网络游戏中,cliet和服务器是通过tcp长连接的。相对于HTTP+WebServer的不同在于:

  • client连接到服务器,需要进行身份验证,通常是client第一个消息包含身份验证数据如用户名密码等,而验证通过后该连接为可信任连接。
  • client 任意时间都可以向服务器发送请求,而不需要服务器立即返回,同样,服务器是在任意时间(当然会有实时性等约束)都可以像client推送消息。
  • client断开连接时,服务器必须捕获该事件,以便完成一些数据清理 *** 作。
  • client对应的一般是个集群,但是client无从得知细节,因为它只连接最外层的一个,给他取个名字“MsgBroker”。
  • Msg Broker 不许有一定的安全控制,如心跳、网络包频率限制等,防范某些可能的攻击。
  • Msg Broker需要高度可定制。不同的游戏主要是逻辑不同,而MsgBroker大多大同小异。当然MsgBroker总是会根据需求稍作修改。
  • Msg Broker 主要瓶颈是IO *** 作,因为它涉及大量的网络连接、断开、心跳、广播消息等。而它具有的领域逻辑则非常非常少。所以Msg Broker的逻辑可以使用动态脚本实现,其实时性、效率都能满足要求。
需要的broker具有的功能:
  • 能够捕获client连接事件
  • 能够捕获client断开事件
  • 具有网络心跳功能
  • 方便的消息发送接口
  • broker可以以client的角色连接到其他Server,因为从其他逻辑角度看,Broker可能是其他服务的使用者。
  • Broker 提供消息收发框架,逻辑层通过插件实现。
  • 实现插件的方式有
    • 动态链接库,可以将逻辑层封装到so链接库中
    • python脚本,逻辑层可以有python脚本实现,Broker封装了载入python、调用python,封装消息发送接口到Pyhton
    • Lua脚本,逻辑层也可以又Lua脚本实现,Broker封装了载入lua、调用lua、封装消息接口给lua。
Msg Broker 结构图

Msg Broker  的安装使用:安装依赖库:

由于msg broker支持Python和lua作为插件,那么必须确保linux下安装了相应的头文件。示例中的插件均只实现了echo功能。

  • 确保Linux系统安装了Python,推荐python2.6
  • 确保安装了Python-devel,如果是centos,直接yum即可。
  • 确保安装了Lua-5.1.4, 其他版本没有测试过
  • 下载Msg Broker最新源码,目前处于0.1版本

svn co https://ffown.googlecode.com/svn/trunk/

  • 编译源码:
    • cd trunk/example/plugin_msg_broker/
    • make
  • 编译动态连接库插件
    • cd plugin/plugin_echo_dll/
    • sh gen_dll.sh
运行示例插件:
  • 运行动态链接库
    • ./msg_broker_server 127.0.0.1 10241 plugin/plugin_echo_dll/libechoso
    • 另开终端,telent 127.0.01 10241, 收入5 回车,再输入5个字符,通讯协议是body长度加回车加body,如图:

  • 运行Python 脚本示例程序
    • ./msg_broker_server 127.0.0.1 10241 plugin/plugin_echo_py/echo.py
    • 同样使用telnet 测试echo功能
  • 运行Lua脚本示例程序
    • ./msg_broker_server 127.0.0.1 10241 plugin/plugin_echo_lua/lua.py
    • 同样使用telnet 测试echo功能
插件层设计分析:插件接口:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/2083859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-07-22
下一篇 2022-07-22

发表评论

登录后才能评论

评论列表(0条)

保存