使用Ranch搭建自己的TCP连接池
上一篇我们讲了ranch的基础逻辑还看了一个简单的echo例子,这次我们尝试真正使用ranch
将Ranch集成到自己的项目中
集成部分的话参照cowboy使用rebar将ranch配置到自己项目的deps目录中即可,erlang.mk应该也可以,不过我自己没尝试过。。有兴趣的可以自己探索下应该都是共通的。这里就不再赘述集成部分了,ranch本身也说过是包装成一个易集成的结构的。
使用ranch
这里我们假设项目中已经有老的tcp接口了,我们现在换成ranch架构(没有也没关系,差距并不大,比较麻烦的都是消息的解包和登陆逻辑的处理)
这里介绍两种使用方式,一种专门起一个进程让进程阻塞在recv部分,有消息就处理,没就保持阻塞,另外一种就是每次让进程设置socket为{active, once},然后使用{tcp,S, Data} 回调来处理的逻辑,这样可以保持进程不阻塞,这种模式可以适用于gen_server模型,你可以把业务逻辑也放到这个接收进程里,虽然不推荐这样做,下面的两个具体实现都会是将消息转发给业务处理进程而不是由接收进程来处理,所以不会体现业务逻辑部分
定义ProtoCol
阻塞模式
cowboy本身就是一个典型的阻塞模型的例子,Cowboy Git库地址,但是要看懂cowboy的处理逻辑还需要了解一些http底层处理,这里我们用最简单的模型来展示ranch的使用
首先,定义我们的类似echo_protocol的tcp消息处理模块,当然他肯定是一个ranch_protocol描述的模块,也就是这个模块必然提供start_link/4并返回{ok, Pid}
这样就很简单了,我们可以根据上一篇中的echo的例子稍微进行改写,加入消息的解析,解析成自己系统可以识别的就可以了
-module(my_protocol).
-behaviour(ranch_protocol).
-export([start_link/4]).
-export([init/4]).
-record(state, {accid = 0,
buffer = <<>>,
pid
}).

本文介绍了如何将Ranch集成到项目中,包括阻塞模式和gen_server模型下的非阻塞模式的TCP连接处理。通过定义ProtoCol,展示了如何在Erland中使用Ranch构建TCP服务,并讨论了在已有TCP框架基础上使用Ranch的理由,如简化管理、扩展便利和保持技术更新。
最低0.47元/天 解锁文章
1253

被折叠的 条评论
为什么被折叠?



