微服务是否应该包装一个暴露给第三方供应商的消息队列?
Should a micro-service wrap a message queue exposed to a third party vendor?
我有一个第三方供应商需要向我们推送消息。我正在考虑让他们将这些消息放入消息队列。因为我不希望需要对队列采取行动的微服务被流量淹没。
授予第三方访问权限以将消息放入队列是否被认为是一种好的做法,或者我应该像 RESTful 微服务一样包装在队列周围?
我会考虑将队列包装在服务中。由于它是第三方,您可能无法控制 if/when 您需要进行更改。比如需要加安全,或者需要引入节流。
如果是纯粹内部的,额外的抽象可能不值得,但外部暴露的资源可能需要更多控制
我一定会按照你的建议去做。比技术问题(可扩展性、容错性等)更重要的是在您和您的供应商之间建立一种有益的动态。
如果您直接公开了一个 queued 端点,那么您实际上将合同控制权交给了消息生产者。作为消息的生产者,他们能够有效地将他们想要的任何消息注入 queue。
众所周知,从合同的角度来看,排队的数据交换格式很难确定。除了有效负载,您还有其他问题,例如寻址、headers、编码、重试和分组语义。相比之下,使用 http 时,可以通过使用诸如 swagger.
的端点定义约定来毫无歧义地描述整个契约
重要的是,通过公开同步服务,您可以保留对合同的控制权。除了控制合同(以及对话的格式)之外,您还可以通过有意义且有用的响应来实施节流、严格验证等,所有这些在异步场景中都会困难得多。
这是一个重要的区别,因为 producer-consumer 关系中的权力平衡与 service-consumer 关系中的权力平衡非常不同。您会发现这会简化您与上述供应商的往来。
我有一个第三方供应商需要向我们推送消息。我正在考虑让他们将这些消息放入消息队列。因为我不希望需要对队列采取行动的微服务被流量淹没。
授予第三方访问权限以将消息放入队列是否被认为是一种好的做法,或者我应该像 RESTful 微服务一样包装在队列周围?
我会考虑将队列包装在服务中。由于它是第三方,您可能无法控制 if/when 您需要进行更改。比如需要加安全,或者需要引入节流。
如果是纯粹内部的,额外的抽象可能不值得,但外部暴露的资源可能需要更多控制
我一定会按照你的建议去做。比技术问题(可扩展性、容错性等)更重要的是在您和您的供应商之间建立一种有益的动态。
如果您直接公开了一个 queued 端点,那么您实际上将合同控制权交给了消息生产者。作为消息的生产者,他们能够有效地将他们想要的任何消息注入 queue。
众所周知,从合同的角度来看,排队的数据交换格式很难确定。除了有效负载,您还有其他问题,例如寻址、headers、编码、重试和分组语义。相比之下,使用 http 时,可以通过使用诸如 swagger.
的端点定义约定来毫无歧义地描述整个契约重要的是,通过公开同步服务,您可以保留对合同的控制权。除了控制合同(以及对话的格式)之外,您还可以通过有意义且有用的响应来实施节流、严格验证等,所有这些在异步场景中都会困难得多。
这是一个重要的区别,因为 producer-consumer 关系中的权力平衡与 service-consumer 关系中的权力平衡非常不同。您会发现这会简化您与上述供应商的往来。