系统间调用

109 阅读4分钟
  1. 抛个话题: 系统和系统之间的调用,什么时候应该用api,什么时候应该用消息组件?
考虑因素API消息组件
同步 vs 异步同步调用,等待即时响应异步处理,不需要立即响应
解耦性较紧密耦合,需要了解接口和数据格式较松散耦合,只需了解如何发送和接收消息
实时性较适用于实时性和低延迟对实时性要求不高,提供更弹性的解决方案
数据量和频率适用于大量数据的点对点通信,频繁调用适合处理大量低频数据,或需要广播消息的情况
安全性相对容易实现身份验证和授权机制安全性需要更多关注,可能需要额外的措施
可扩展性相对容易实现版本控制和演化更容易引入新系统,通过订阅感兴趣的消息通信

1.同步还是异步 2.解耦 3.实时性 4.数据量和频率 5.安全性 6.可扩展性

两者可靠性的比较

通常依赖于具体的实现和使用情境,而不是绝对的规律。API和消息组件在不同方面有各自的优势和劣势。

API的可靠性优势:

  1. 同步通信: API通常是同步的,请求方等待即时响应,因此可以更容易检测和处理错误。
  2. 明确的接口: API通常有明确定义的接口和规范,便于进行版本控制和管理。
  3. 直接的点对点通信: API通常是直接的点对点通信,可以更容易地确定通信的成功或失败。

消息组件的可靠性优势:

  1. 异步通信: 消息组件通常是异步的,可以处理系统之间的解耦,同时提供更高的灵活性和可扩展性。
  2. 消息队列的持久性: 消息队列通常提供消息的持久性,即使在消息发送或接收系统暂时不可用的情况下,消息也能够在稍后被处理。
  3. 广播和订阅: 消息组件支持广播和订阅模型,可以轻松地实现多系统之间的消息传递。

在实际应用中,通常会根据具体需求来选择合适的通信方式。如果需要即时响应、明确的接口和点对点通信,API可能更合适。如果系统之间的解耦、异步通信和消息的持久性更为重要,消息组件可能更为合适。在任何情况下,都需要考虑实现适当的错误处理和容错机制,以确保通信的可靠性。

例子:对实时性要求高的倾向api

例子:用户下单没库存了,应该返回下单失败啊

当时也能做成异步:比如,先异步执行扣库存,只要扣库存比货物发出要早,那就再快马加鞭去通知下游拦截

你提到的情景涉及到了一个常见的库存管理问题,其中实时性确实是一个关键考虑因素。

在这种情况下,使用API并强调即时响应可能是一个更合适的选择。

使用API的优势:

  1. 即时响应: API通常是同步的,可以在用户下单时立即进行库存检查,如果库存不足,即时返回失败响应。
  2. 明确的交互: 用户收到即时的响应,可以更容易理解下单是否成功,而不必等待异步处理的结果。
  3. 避免超卖问题: 即时的库存检查和响应可以避免超卖(卖出的商品库存实际上没有了)问题,提高订单处理的可靠性。

异步执行的考虑:

  1. 异步执行扣库存: 即使采用API进行库存检查和响应,你仍然可以选择在后台异步执行扣库存等操作,以加快用户下单过程。这意味着用户可以迅速得到下单结果,而实际的库存处理可能稍后进行。
  2. 通知下游系统: 如果异步执行的扣库存比货物发出要早,你可以确保在扣除库存之后再通知下游系统,以确保库存的一致性。

注意事项:

  1. 事务一致性: 确保库存检查和扣库存是一个原子操作,避免因为异步执行而引起的事务不一致问题。
  2. 超时处理: 在使用API时,考虑设置适当的超时机制和错误处理,以应对可能的网络或系统故障。
  3. 监控和日志: 对异步执行的任务进行监控和日志记录,以便及时发现和处理潜在的问题。

总体而言,根据实际需求和系统架构,将同步的API与异步的后台任务结合起来,可以在实现实时性的同时提高系统的性能和可靠性。