gpt4 book ai didi

kotlin - 如何弥合Netty ChannelInboundHandler与kotlinx协程调度程序之间的差距?

转载 作者:行者123 更新时间:2023-12-02 13:01:04 25 4
gpt4 key购买 nike

我有一个多路复用应用程序协议(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com