如何从客户端角度处理CQRS

时间:2014-06-26 11:58:41

标签: javascript rest websocket client-server cqrs

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

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

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

3 个答案:

答案 0 :(得分:3)

嗯,这一切都取决于你打算在UI中做什么。

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

如果您对AJAX更熟悉并希望使用REST,那么您可以使用此asynchronous approach,但是您需要汇总才能获得HTTP 303 See Other。它并不完美,但它可能只是为了操作而打开WebSocket。

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

答案 1 :(得分:0)

要完成vtortola的回答,您还可以查看此项目SwaggerSocket。它旨在为REST API提供websocket接口,以获得更好的性能。

答案 2 :(得分:0)

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

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

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