背景:我正在工作的一个新项目,将运行在AWS。我们正在尝试使用一种现代的微服务架构,并利用云技术,但我们还没有太多的经验。由于一些库限制,我们至少需要在Python中运行一些服务,而我的组织对此非常缺乏生产经验。我们以前的大多数应用程序都在Spring/Java中(我们的一些其他微服务将使用它们运行)。
在我们的体系结构中,我们希望在一种使用SQS/SNS进行异步通信的处理管道中运行许多微服务。同时,他们需要能够接受来自我们的前端的REST通信或其他需要服务所拥有的数据的服务。
我的问题是:在python中,我如何最好地处理这两种形式的通信?我下面的解决方案是可行的,还是我们应该用我们的沟通策略做些完全不同的事情?
我想出的是:我当前的想法是让发生在EC2实例上的微服务的后台/管道处理,它将侦听和处理SQS消息,然后向存储服务发出POST请求,该存储服务位于AWS网关之后,并使用Lambda函数将结果存储在数据库中。通过这种方式,我们可以让前端/其他服务调用API网关,以便在不中断SQS消息处理的情况下从微服务中获取数据。这也使我们能够利用无服务器架构,使扩展变得更加简单。
我个人是相当缺乏经验的,没有能够通过我自己的搜索找到令人满意的信息或这样的架构的例子,所以我希望你能给我任何的见解或投入。
为了澄清,我最感兴趣的是一个更细粒度的问题,即如何向REST和消息传递开放我的微服务,或者其他模式是否更好。
发布于 2017-11-07 19:16:44
如果您希望通过REST和SQS消息触发基于Lambda的微服务,那么只需使用两个API网关并将SQS消息发布到SNS主题即可。可以从多个事件源触发Lambda函数,请参阅此处:http://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-function.html
如果这不合理的话请告诉我。如果您选择在EC2上运行您自己的Python运行时,并且正在寻找一个运行异步代码的好的Python框架,我建议使用Twisted (https://twistedmatrix.com/trac/)。
发布于 2017-11-07 18:02:06
因为你问过
..。或者其他模式更好。
用一种完全混合的方法来实现这类事情的现代方式。我要提供的解决方案是一个AWS特定的解决方案(而且,我知道它并不流行,但我非常不喜欢AWS,我更喜欢数字海洋)
如果您愿意,可以将Create、Update、Delete (CUD) ->实现为容器化服务(virts是一种有十年历史的技术,不能像容器那样快速地旋转),或者更好地实现网关后面的一组lambda(您提到了网关)。读和写到数据存储是如此普遍,几乎不值得谈论。但是,您将希望将对实体的所有更改发布到SNS主题。这是其他服务可以访问由SNS创建的事件通道的地方(对记录而言,这不是一个真正的主题)。如果你把数据放进发电机,它会自动为你触发一只羔羊,这样你就可以一石二鸟了。
另一方面,READ (R)是事情变得更有趣的地方:所有读取都应该指向分布式缓存(例如,由AWS支持的REDIS )。您可以使用Lambda从SNS主题接收您的CUD事件,然后您可以修改该主题并将其发布到您的REDIS集群(这将处理传播)。
这种策略被称为CQRS。
自从我最初回答你的问题以来,你的问题就有了明显的更新。
要让您的服务处理REST端点和异步消息传递(入站是一个真正的问题),AWS将变得非常棘手。SNS (尽管它说了什么,也因此我讨厌它)不是一个话题,所以你不能接收广播消息。但这正是您需要的,如果您的微服务是水平可伸缩的,并且在集群中(是/将是,对吗?)以便所有实例都能接收到相同的消息。
我知道的唯一两种方法是: 1.站起自己的AMQP集群,使用lambda发布一个真实的主题,然后从其中接收到它。但这有许多业务问题要解决。2.将传入的消息发布到Redis集群(来自AWS),并使您的应用程序成为集群的一部分,从而将消息传播到它。
https://softwareengineering.stackexchange.com/questions/360377
复制相似问题