【问题标题】:How to handle CQRS from a client-side perspective如何从客户端的角度处理 CQRS
【发布时间】:2014-08-17 06:31:06
【问题描述】:

我的公司计划在我们的后端使用 CQRS 架构,但作为客户端开发人员,我对如何使用请求有点困惑。以下是我想出的方法,从我的角度来看,没有一个是理想的:

  1. 服务器一直等待,直到队列得到处理并在响应中返回所需的数据。 (从性能的角度来看,这听起来像是一种非常糟糕的方法);
  2. 一旦请求被添加到队列中,客户端发出请求并返回“202 Accepted”,然后客户端使用间隔系统进行池化,直到它从后端获取必要的数据(我不是每秒执行 X 个 http 请求的忠实粉丝);
  3. Web Sockets ... 似乎是完美的解决方案,因为一旦处理完数据,服务器就能够将数据推送到客户端(我有点担心在整个应用程序周围打开了数千个套接字)。

所以问题是:解决这个问题的最佳方法是什么? (不一定是上述之一)

【问题讨论】:

  • 要完成vtortola的回答,你也可以查看这个项目SwaggerSocket。它旨在为 REST API 提供 websocket 接口以获得更好的性能。
  • 谢谢,我们最终使用了 signalR(.net)。

标签: javascript rest websocket client-server cqrs


【解决方案1】:

嗯,这完全取决于您计划在 UI 中执行的操作。

如果您有 SPA 并且对events and subscriptions in Javascript 有很好的理解,那么单个 WebSocket 连接似乎是最自然的选择。如果连接大部分时间都是空闲的,那么数千个 WebSocket 连接在服务器中不是问题,并且服务器是异步的(以避免线程饥饿)。但是……你为什么想要一个 REST 接口?您可以通过带有关联 ID 的 WebSocket 发送请求,然后等待具有相同关联 ID 的响应以知道何时完成,这样您就可以避免为每个请求创建新连接的开销。

如果您更熟悉 AJAX 并想使用 REST,那么您可以使用此 asynchronous approach,但您需要池化直到您获得 HTTP 303 See Other。它并不完美,但它可能比仅仅为了那个操作而打开一个 WebSocket 更好。

阻止连接直到有响应是一种非常糟糕的方法。网络算不上可靠,所以如果连接断开,浏览器需要知道如何找出操作的结果。

【讨论】:

  • 谢谢,由于双向消息传递,我决定使用 websockets 版本;它提供了很多控制。我希望它能很好地扩展。
【解决方案2】:

传输不是唯一的问题,你将如何同步服务器和客户端上的合约? 我通过将我所有的命令和查询渲染成一个 javascript 来解决这个问题。就我而言,我使用了 t4 模板引擎,但可以使用任何模板引擎。您可以在这里阅读更多内容

http://andersmalmgren.com/2014/02/05/typed-javascript-contracts-using-t4-templates/

至于传输,我认为 REST 很好,如果您使用例如 .NET WebApi 并正确使用 async 关键字,框架将在有等待的 I/O(DB 等)时重用线程

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2020-03-10
    • 2013-04-21
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多