性能
灵活性和实现速度,添加新协议变体
它将帮助开发人员从shell探索协议变体
整个协议引擎的总体图像如下:
底部:
每个堆栈的底部有几个端口,或者可能也有一个gen_tcp(对于独立通道有多个相同的堆栈,因此我们不能太静态地注册进程,必须在各处传递Pids)。
在端口上面是一些由监督器管理的模块(与系统一起启动,在没有错误的情况下保持整个生命周期)。
顶部:
由事件发生触发(在一般意义上而不是在事件处理程序意义上)的是面向连接的协议端点(例如具有
connect()
和close()
语义)。协议栈的顶部端可能只能动态启动,因为堆叠在一起形成堆栈的模块是动态可配置的,并且可能会从连接到连接改变。
当前计划通过传递模块名称列表+可选参数从顶层消耗,当
connect()
沿着堆栈调用时。顶级进程将被链接,因此如果出现任何问题,整个连接都会失败。
模块类型和它们之间的通信类型
迄今为止发现了几种类型的模块:
无状态过滤器模块
带有状态的模块,一些适合gen_server,一些适合gen_fsm,但大多数可能是简单的服务器循环,因为选择性接收通常很有用并且可以简化代码。
层之间通信的类型:
独立发送和接收数据包(从外部看独立)
同步调用发送某些内容,阻塞直到有答案,然后将结果作为返回值返回。
多路复用器向多个模块发出请求(这是我在这里的定义,以便讨论)
具有不同附着点(当前由原子命名)与面向上方的模块进行通信的解复用器。
目前我的分离器只在静态底部堆栈中,而不在动态创建的顶部。当前仅在顶部存在复用器。
在处理我之前链接的问题的答案和评论中,我听说API通常只应该由函数组成,而不是消息,并且我同意这一点,除非有说服力的理由。
请原谅我冗长的问题说明,但我认为它仍然对所有类型的协议实现都有普遍用途。
我将在回答中写下我计划做的事情,并且还将解释结果的实现以及我的经验,以便在这里实现某些普遍有用的东西。