- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个多路复用应用程序协议(protocol),我已经实现了流水线阶段,用于处理双向协议(protocol)中表示每种消息类型的Kotlin数据类。没有正式的请求-响应模式。客户端和服务器可以在套接字寿命的任何时候互相发送消息。
在该协议(protocol)中,存在一个约束,即对于任何连接的客户端,消息都是串行处理的。也就是说,当服务器从客户端收到一条消息时,它无法处理来自客户端的下一条消息,直到完全处理了前一条。相同规则适用于处理来自服务器的消息的客户端。这或多或少是如何在Netty中处理通道管道的。给定的管道阶段一次只能处理一件事。通过在新的执行程序组上具有阻塞管道阶段,可以很容易地对其进行编码。
但是,我想为客户端可能以挂起函数形式发送的每种消息编写处理程序,因为服务器响应客户端消息可能执行的操作范围非常广泛,并且可能涉及联系其他服务器或数据库和一组消息类型还可以在处理过程中内部锁定服务器状态的某些部分,以排除其他并发连接的客户端。因此,我需要一种从Channel管道的尾部过渡到协程上下文的方法,以使管道阶段被“阻止”继续处理消息,但在此阶段不阻止其他通道的管道的处理,并且无需为每个套接字创建单线程事件执行程序。
我曾考虑过使用Netty的单独的调度程序和事件循环来表示每个客户端 session 的处理,并使用actor来表示每个客户端 session ,以便将接收到的消息发送到actor的邮箱通道,并且协程按照接收到的顺序对其进行处理,并且我可以取消actor,并取消它,然后关闭SocketChannel
,反之亦然。但这很丑陋,并且不符合Netty的精神。
tl; dr我想知道,实现流水线阶段并将其暂停函数与其执行者组完全集成的最佳方法是什么?
最佳答案
过去的时间里,我建立了一座桥梁,以连接Vert.x(基于Netty)和协同程序。 https://paste.ubuntu.com/p/9VxZkdn9tt/
(注意:它有一些我尚未修复的错误。)
Vert.x提供了回调样式ReadStream。我将其转换为协程中的块同步样式InputStream。就像InputStream
中的java.io
一样。
因此,这不是避免问题的最佳方法。但是看起来,异步风格有时会出现一些问题。
关于kotlin - 如何弥合Netty ChannelInboundHandler与kotlinx协程调度程序之间的差距?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54565942/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一名优秀的程序员,十分优秀!