我们正在就最佳解决方案进行辩论,双方都没有达成协议。
我们有一种产品吸收了“消息”。每次收到新消息时,我们都需要将此数据发送给3个服务进行处理。
服务#1要求数据采用特殊格式。为此,我们将数据放入服务读取的SQS中。
服务2读取消息字段:[a,b,c],然后我们以原始格式发送。
服务#3读取消息字段:[a,b,c,d,e]和protobuf。
对于服务2和3,我们将数据发送到2个单独的SQS查询中。 但是,我们可以在SNS主题中发送数据,并从中读取队列2和3。为此,我们将发送服务3的protobuf,因为它具有服务2所需的所有字段。
写服务2的人不想这样做,因为他不想获得多余的数据,而他们只会忽略这些数据。
编写服务#3的人认为,当服务#2可以简单地读取protobuf#3并忽略不想要的字段时,系统protobuf并将其发送到2个单独的SQS队列而不是1个SNS主题会浪费资源。
从架构的角度来看,谁是正确的?
答案 0 :(得分:0)
要“通知”事件的其他服务时使用SNS,尤其是当有多个服务可能对该事件感兴趣时。
整个基于格式的区分似乎是一种人工构造,因此必须使用SQS。 SQS最适合点对点通信。
从一项服务发布到2-3个地方将使您的服务出现原子性和可靠性问题(发布到SQS之后但发布到SNS之前,发布服务会崩溃吗?)。拥有一个用于放置消息的单一系统,可以更轻松地解决这些问题。
最后,它取决于您的 系统要求。如果要由我决定,我将更改所有下游服务,以通过SNS接收通知(所有服务的格式都一致)。
答案 1 :(得分:0)
您正在进行的辩论是有观点的。两种方法都需要权衡。最后,您应该努力从长远来看(比如说从现在开始1年)会更好。
仅当SNS-SQS被认为具有高可用性时,发布到多个SQS队列并没有多大意义。我建议在消费者方面拥有一个发布者(最终数据集是相同的)和相同的合同。
让消费者决定要对数据做什么(丢弃事件;丢弃字段)。如果用户确实不希望使用其他字段,则可以实现附加的反腐败层(此ACL将位于用户域内)。
发布者应从他们的角度以最通用的格式发布数据。这也可以确保发布者应用程序不会跨越其域。
以耦合服务为代价优化资源将是一个非常糟糕的方法。