我们正在实施一项竞价云服务,该服务将从外部API服务接收订单。每个收到的订单都是 1:1到拍卖。
我们每天可以拥有超过 2000个订单(拍卖)。 我们决定使用微服务+ Redux 来区分订单和拍卖之间的关注。
Bellow是每项服务的解释。
外部API
Enternal API只是一个将订单推送到我们的订购服务的网站,并从我们的订单服务接收更新,我们无法控制它。
订购服务
Orders拥有大量信息(属性),客户端(移动应用程序)使用这些信息来获取决定加入拍卖的信息。例如,这就是订单的样子:
{
id: 123,
description: 'Some description',
salePrice: 0,
minPrice: 1000,
openPrice: 500,
status: 'active',
address: 'Some address',
file: '.../some-file.pdf',
client: 'Joe Doe',
notes: 'Some notes',
createdAt: '12345678',
pending: false,
postpone: false,
...moreproperties
}
在订购服务中,订单可以在拍卖开始前随时通过服务器更新(地址,名称,openPrice,minPrice,状态等) 动作如下。
{ type: LOAD_ORDERS, orders }
{ type: PEND_ORDER, id }
{ type: POSTPONE_ORDER, id }
{ type: SET_ORDER_AUCTION, id, auction, salePrice }
{ type: UPDATE_ORDER, id, properties }
拍卖服务
此服务中的拍卖对象可能如下所示:
{
id: 'abcd',
orderId: 123456,
increment: 1,
outBid: { agentId: 'b1', price: 545 },
bestBid:{agentId: 'b2', price: 550 },
openPrice: 500,
currentPrice: 550,
status: 'started'
startedByAgent: 'a1'
}
可以通过以下操作更新拍卖:
{ type: JOIN_AUCTION, id, agentId, type }
{ type: START_AUCTION, id, agentId }
{ type: PLACE_BID, id, agentId, price }
{ type: END_AUCTION, id, agentId }
API服务
它就像前端应用程序和微服务之间的网关一样。以行动的形式接收和发送客户(手机)向订购服务或拍卖服务的请求。
工作流:
1 - 外部API 通过LOAD_ORDERS将当天的订单推送到订购服务,同时将CREATE_AUCTIONS操作分派到操作服务以创建每个订单的拍卖。
2 - 用户打开移动应用并获取当天的订单列表,其中包含订购服务的公开价格。
3 - 用户加入特定订单 - API服务会创建一个将出价的出价方代理。 - API服务通过JOIN_AUCTION发送加入操作,以加入竞价服务
上的竞价4 - 拍卖师代理商开始竞价并开始竞价。
5 - 加入出价方代理商开始通过竞价服务上的PLACE_BID操作进行出价。
6 - 当拍卖结束时,拍卖师代理商通过调度END_AUCTION来结束拍卖。
7 - 当拍卖结束时,销售价格和拍卖细节(通过对象)通过SET_ORDER_AUCTION发送到订单服务。
8 - 订单服务处理SET_ORDER_AUCTION并使用最终 salePrice 和拍卖对象更新订单状态,然后等待付款
9 - 从客户收到付款信息后,订购服务将其提交给外部服务
我的问题是:
上述工作流程是否是使用微服务+ Redux并更新每个服务状态的合理方法?
使用redux微服务时,可以将微服务的操作发送到另一个吗?我的问题是因为在使用微服务+事件源+ CQRS时,不推荐服务互通,而是使用Sagas作为将事件转换为命令的中间服务。
我的另一个问题是在哪里放置业务逻辑(验证),例如,如果拍卖未开始或已经结束,则投标人无法发送出价,如果投标人未加入,则投标人无法发出出价还没拍卖。这个逻辑是什么?在行动,中间件还是减速机?以及如何处理客户的错误?
一般来说,微服务+ Redux的最佳实践是什么?
使用微服务+ Redux 与微服务+事件采购+ CQRS 的利弊是什么?
很抱歉这篇长篇文章,我只是需要一些方向,因为我找不到任何关于这个主题的文档,我不确定我是否正在接近这一点。
任何建议都将不胜感激!!!
答案 0 :(得分:0)
我认为这个问题与指导方针相去甚远。
不过,我要说的是编写您自己的redux中间件来集成您的微服务。 API非常简单:
$ LINE='Line 21800: Value: $${scripts-dir1}part_archive_ret_hist_stg.ksh
$ echo $LINE|awk -F "[{}]" '{print $2"\n"$4}'
scripts-dir1
databse-name
在最外部的功能(store => next => action => {
let result = next(action)
return result
}
)中,您可以添加微服务列表器并通过商店引用来调度动作。
在最内部的功能(store =>
中,您可以通过将请求发送到微服务来对redux应用程序中的操作做出反应。