抽取rabbitmq网络层做的echo server

标签: erlang | 发表时间:2011-08-08 22:22 | 作者:那谁 2sin18
出处:http://www.codedump.info

传说rabbitmq网络层实现的优雅高效,于是我就尝试着将其中的网络层抽取出来,模拟着做了一个echo服务器,代码放在这里.

这里面绝大部分都是可以重用的,或者说稍微改一下配置比如端口地址就可以了.业务相关的部分可以通过回调函数start_client来做到,见echo_server.erl代码中,启动tcp_server_sup的时候,传入的Acceptcallback参数是echo_server:start_client函数,这个函数将在接收到一个新的链接之后调用,在echo_server中这个函数的作用是通过tcp_connection_sup动态创建一个echo_connection子进程来管理接收到的这个socket,在echo_connection中真正做业务处理.这里的tcp_connection_sup,也是可以根据传入的MFA参数来创建子进程的,为以后的扩展提供了方便.

再来看echo_connection中如何处理业务逻辑.在之前看过的erlang服务器代码比如onecached中,处理客户端连接请求的做法是,创建两个子进程,其中一个负责接收数据,另一个是一个gen_fsm负责控制处理逻辑的业务状态机,两者之间通过消息传递.这样的做法有两个问题,第一是子进程之间传递消息多了一次消息copy的过程,第二是gen_fsm内部实际上是根据tag来判断状态机的走向(具体可以阅读stdlib中gen_fsm的实现代码),两个因素加起来对性能的影响还是不小的.

rabbitmq的做法是内置状态机,通过切换callback的形式处理不同的业务,这样只有一个子进程处理一个链接,性能提高不少.

测试这个echo服务器的客户端我使用的是telnet,telnet输入的数据会自动在后面加上”\r\n”发送到对端,于是代码中以这个来判断是否接收了一条消息,抽取出来回复给对端.

整个代码中,就是echo_server/echo_connection部分需要根据业务重写,其他的部分都可以重用,另外也可以按照前面提示的自己嵌入状态机来处理请求.

参考资料: Rabbitmq的网络层要点浅析

相关 [rabbitmq 网络层 echo] 推荐:

抽取rabbitmq网络层做的echo server

- 2sin18 - codedump
传说rabbitmq网络层实现的优雅高效,于是我就尝试着将其中的网络层抽取出来,模拟着做了一个echo服务器,代码放在这里.. rabbitmq的做法是内置状态机,通过切换callback的形式处理不同的业务,这样只有一个子进程处理一个链接,性能提高不少.. 测试这个echo服务器的客户端我使用的是telnet,telnet输入的数据会自动在后面加上”\r\n”发送到对端,于是代码中以这个来判断是否接收了一条消息,抽取出来回复给对端..

echo 与 sudo

- 肥恩 - www.kuqin.com
众所周知,使用 echo 并配合命令重定向是实现向文件中写入信息的快捷方式. 本文介绍如何将 echo 命令与 sudo 命令配合使用,实现向那些只有系统管理员才有权限操作的文件中写入信息. 比如要向 test.asc 文件中随便写入点内容,可以:. $ echo "信息" > test.asc. $ echo "信息" >> test.asc.

【架构】关于RabbitMQ

- - 学习笔记
1      什么是RabbitMQ. RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗. 消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然:. 例如一个日志系统,很容易使用RabbitMQ简化工作量,一个Consumer可以进行消息的正常处理,另一个Consumer负责对消息进行日志记录,只要在程序中指定两个Consumer所监听的queue以相同的方式绑定到同一个exchange即可,剩下的消息分发工作由RabbitMQ完成.

RabbitMQ (三) 发布/订阅

- - CSDN博客架构设计推荐文章
转发请标明出处: http://blog.csdn.net/lmj623565791/article/details/37657225. 本系列教程主要来自于官网入门教程的翻译,然后自己进行了部分的修改与实验,内容仅供参考. 上一篇博客中,我们实现了工作队列,并且我们的工作队列中的一个任务只会发给一个工作者,除非某个工作者未完成任务意外被杀死,会转发给另外的工作者,如果你还不了解: RabbitMQ (二)工作队列.

rabbitmq java client api详解

- - 五四陈科学院
以下内容由 [五四陈科学院]提供. AMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现. 每个rabbitmq-server叫做一个Broker,等着tcp连接进入. 在rabbitmq-server进程内有Exchange,定义了这个消息的发送类型. Queue是进程内的逻辑队列,有多个,有名字.

RabbitMQ:镜像队列Mirrored queue

- - 飞翔的荷兰人
        在上一节 《RabbitMQ集群类型一:在单节点上构建built-in内置集群》中我们已经学习过:在集群环境中,队列只有元数据会在集群的所有节点同步,但队列中的数据只会存在于一个节点,数据没有冗余且容易丢,甚至在durable的情况下,如果所在的服务器节点宕机,就要等待节点恢复才能继续提供消息服务.

RabbitMQ关键性问题调研

- - Java - 编程语言 - ITeye博客
摘要:本篇是本人对RabbitMQ使用的关键性问题进行的调研,如性能上限、数据存储、集群等,.             具体的 RabbitMQ概念、使用方法、SpringAMQP配置,假设读者已有了基础. 1.1  RabbitMQ数据速率问题. 在边读边写的情况下:速率只与网络带宽正相关,网络使用率最高能达到接近100%,并且数据使用率很高(90%以上).

利用RabbitMQ实现分布式事务

- -
  实现要点:1、构建本地消息表及定时任务,确保消息可靠发送;2、RabbitMQ可靠消费;3、redis保证幂等.   两个服务:订单服务和消息服务.   使用springboot构建项目,相关代码如下. //设置消息发送确认回调,发送成功后更新消息表状态. //定时扫描记录表,将发送状态为0的消息再次发送,甚至可以记录重发次数,必要时人工干预,生产环境中需要单独部署定时任务.

亚马逊发布Echo室内语音控制系统 售价199美元

- - cnBeta.COM
亚马逊周四发布新硬件产品Echo. 该产品为一套内置语音助手的扩音器设备,旨在为用户的房间提供独立专注的音控系统. 该设备支持闹铃、音乐播放控制、天气查询、网络搜索,以及新闻查询等多种功能,而所有的操作都通过语音控制完成. 此外该设备还能通过蓝牙和WiFi与Fire Phone连接,或通过浏览器与iOS、Android及PC设备连接,以实现多媒体播放功能.

[转][RabbitMQ+Python入门经典] 兔子和兔子窝

- lostsnow - heiyeluren的blog(黑夜路人的开源世界)
高级消息队列协议(AMQP1)是一个异步消息传递所使用的应用层协议规范. AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具. RabbitMQ作为一个工业级的消息队列中间件,基于AMQP协议的实现,由erlang语言编写. 本文讲解 RabbitMQ+Python 的使用.