扭曲的 RPC 是不是保证按顺序到达?

Posted

技术标签:

【中文标题】扭曲的 RPC 是不是保证按顺序到达?【英文标题】:Are twisted RPCs guaranteed to arrive in order?扭曲的 RPC 是否保证按顺序到达? 【发布时间】:2010-08-19 17:17:56 【问题描述】:

我正在使用twisted 来实现客户端和服务器。我已经在客户端和服务器之间设置了 RPC。所以在客户端我做protocol.REQUEST_UPDATE_STATS(stats),这意味着在客户端传输上发送一条带有transport.write的消息,这是["update_stats", stats]的一些编码版本。当服务器接收到这个消息时,服务器协议上的dataReceived 函数被调用,它解码它,并根据消息调用一个函数,如本例中的CMD_UPDATE_STATS(stats)

如果在客户端上,我执行以下操作:

protocol.REQUEST_UPDATE_STATS("stats1")
protocol.REQUEST_UPDATE_STATS("stats2")

...我是否保证"stats1" 消息在服务器上的"stats2" 消息之前到达?

更新:为更清晰而编辑。但现在答案似乎很明显——不可能。

【问题讨论】:

什么是“RPC”?你的意思是网络消息?您使用的是 TCP 套接字还是 UDP?不同的消息是通过 same 套接字还是不同的?您的协议是否允许异步响应?是否有任何中间件可以重新排序请求?如果您想要一个正确的答案而不是仅仅猜测可能不适用于您的情况,那么您必须更加具体。 【参考方案1】:

它们将按照 Python 进程收到请求的顺序到达。这包括连接建立时间加上包含请求数据的数据包。所以不,这不能保证是发送进程发送请求的顺序,因为网络延迟、丢弃的数据包、发送方数据包排队等。对于分布式系统,“有序”也是松散定义的。

但是是的,一般来说,只要它们相隔较长的时间(互联网上的 100 毫秒),您就可以指望它们按顺序交付。

【讨论】:

您可以指望它们按顺序发送。也许。取决于您使用的传输方式等。正如 Python 的禅宗所说:“面对歧义,拒绝猜测的诱惑。”。这个问题非常模棱两可,在提问者提供更多信息之前,您真的不应该回答它:)。

以上是关于扭曲的 RPC 是不是保证按顺序到达?的主要内容,如果未能解决你的问题,请参考以下文章

Django Channels 2.4 ... WebSocket 消息是不是总是按顺序到达

MFC中如何让多线程按先后顺序执行,第一个来的先执行,以后按先后到达的顺序执行

lock() 是不是保证按请求的顺序获得?

Socket.io 是不是保证按客户端顺序接收广播事件?

有三个线程T1 T2 T3,如何保证他们按顺序执行

为什么这个C#代码不按顺序执行?不是ASYNC(至少我认为不是)