抽取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关键性问题调研

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

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

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

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

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

使用django+celery+RabbitMQ实现异步执行

- MetUrMaker - idv2
RabbitMQ大家应该不陌生,著名的消息队列嘛. 可惜我最近才听说它的大名,了解之后不禁惊呼,世界上居然还有这种东西. 立刻觉得手里有了锤子,就看什么都是钉子了,主网站不愿意干的操作统统扔给RabbitMQ去做吧. 言归正传,先介绍一下这篇文章的应用场景吧. 我们知道大型网站的性能非常重要,然而有时不得不做一些相当耗时的操作.

Python 的服务器推送解决方案:Orbited + RabbitMQ

- 非狐外传 - python.cn(jobs, news)
最近公司要用到服务器推送技术,google了一下,nodejs固然好,但是公司的东西都是python搞的,. 所以选择了python的 Orbited +  RabbitMQ,无奈Orbited文档极其缺乏,所以要做下笔记. 以下都是在windows平台上搞的测试. RabbitMQ:先要装好Erlang,然后下RabbitMQ的win版exe文件安装,由于要用到stomp协议,.