【问题标题】:Websocket with Redux, message request, message response is received always in order?带有Redux的Websocket,消息请求,消息响应总是按顺序接收吗?
【发布时间】:2017-02-18 06:30:56
【问题描述】:

假设我按“Alpha”、“Beta”、“Charlie”的顺序编辑我的个人资料名称

那么响应消息总是有序的?

有没有“Alpha”会是最后一条回复消息,所以我的个人资料名称最终被编辑为“Alpha”的情况?

还原)

例如,我在我的应用程序中使用 Redux。

在 Redux App 中,我将使用 (socket.send) 分派 EDIT_PROFILE_REQUEST 操作 3 次,其负载依次为配置文件名称、“Alpha”、“Beta”、“Charlie”。

如果编辑过程完成,EDIT_PROFILE_SUCCESS 动作将被调度。

我想知道的部分是 EDIT_PROFILE_SUCCESS 也按顺序收到,“Alpha”,“Beta”,“Charlie”。 ?

我能否保证回复消息始终井井有条,以便我的个人资料名称将被编辑为“查理”?

【问题讨论】:

    标签: sockets asynchronous websocket socket.io redux


    【解决方案1】:

    是的,也不是。

    TL;DR -> 您不能保证 3rd 方套接字服务按该顺序传递您的消息。但是,在大多数情况下,您可以设计 javascript 应用程序,使其表现得好像它是一种保证。

    如果您使用的是socket.send,我会假设这是一个像 socket.io 这样的第 3 方 websocket 服务。在这种情况下,你正在从你的 js 客户端进行通信,使用 redux 管理内部数据“状态”,到另一台计算机,即 websocket 服务器。

    websocket 的行为是 在您的 javascript 客户端的边界之外。即使服务认为它会按顺序响应,现实世界也可以干预……电源可能会在 (A)、(B) 和 (C) 请求之间中断。然后 A 也被接受并响应,与 (C) 相同,但 websocket 服务器从未看到 (B)。

    这是一个极端的例子。

    如果实施得当,Redux 可以帮助推动一些保证或安全假设。它可以帮助确保您的 js 应用程序的“状态”或数据更改的顺序是同步的,即如果您只在 javascript 应用程序中执行 (a) 然后 (b) 然后 (c),它们会按该顺序及时发生.

    关键是管理该边界。在用户决定单击按钮后,您可以通过等待单击来管理用户单击您的 js 应用程序的边界。同样,您可以等待来自 websocket 的确认,它确实执行了 (A) (B) 或 (C)。

    对于您的示例,一个简单但非常有用的模式是让您的 js 应用程序表现得好像订单得到保证,并采用“接受最新请求”的方法。如果你触发 socket.send(A),你会等待响应。如果 (B) 在套接字说它已获得 (A) 之前发送,则丢弃 (A) 并发送 (B),然后等待套接字回复 (B) 操作是否成功。

    【讨论】:

    • 谢谢,用'sequence number'的概念来保​​证顺序怎么样?再次感谢你!如果有这个问题的一些资源。请告诉我。 !还有其他解决方案吗?
    • 看似简单,但这个问题是 CS 中最具挑战性和最有趣的问题之一......分布式计算。这段视频youtube.com/watch?v=9dALrnCOLNE 很好地解释了一些看似简单的“订单问题”如何变得异常复杂,并且可以解决。但在实践中,在 javascript 客户端上使用 redux,有更多直接和实用的方法“保证秩序”。您是否有特定的问题、错误或用例?
    • 确保在 3 次编辑后不会返回“Alpha”的实用方法是不触发“EDIT_SUCCESS”样式操作,该操作会将 JS 应用程序上的名称更改为“Alpha”,除非那是发送的最后一个“EDIT_REQUEST”。 IE。如果您在 Alpha 之后为 Beta 发送了 EDIT_REQUEST,并且从 websocket 获得了成功的 BETA 更改,您将停止等待 Alpha 成功并忽略它。
    猜你喜欢
    • 2021-07-14
    • 2018-02-15
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2020-01-02
    相关资源
    最近更新 更多