我们正在实施一个拍卖云服务,它将根据需要从外部 API 服务接收订单。每个收到的订单都是1:1 的拍卖。
我们每天可以有超过2000 个订单(拍卖) 。我们决定使用微服务 + Redux来分离订单和拍卖之间的关注点。
下面是每个服务的解释。
外部 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服务
它就像前端应用程序和微服务之间的网关一样工作。以操作的形式接收来自客户端(手机)的请求并将其发送到Order Service或Auction Service。
工作流程:
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 - 一旦从客户那里收到付款信息,然后通过订单服务提交给外部服务
我的问题是:
上面的工作流程是使用 Microservices + Redux 并更新每个服务状态的合理方法吗?
使用 redux 微服务时,可以将操作从微服务分派到另一个微服务吗?我的问题是因为在使用微服务 + 事件溯源 + CQRS 时,不建议使用服务互通,而是使用 Sagas 作为将事件转换为命令的中间服务。
我的另一个问题是在哪里放置业务逻辑(验证),例如,如果拍卖未开始或已经结束,则投标人无法发送投标,如果他/她尚未加入拍卖,则投标人无法发送投标。有人把这个逻辑?在行动中,中间件还是减速器?以及如何处理返回给客户的错误?
一般来说,微服务 + Redux 有哪些最佳实践?
使用微服务+ Redux与微服务 + 事件溯源 + CQRS的优缺点是什么?
很抱歉这篇长文,我只是需要一些指导,因为我找不到关于这个主题的任何文档,我不确定我是否接近这个正确的。
任何意见,将不胜感激!!!