当前位置: 首页 > 知识库问答 >
问题:

AWS事件采购实施

公西志文
2023-03-14

我在微服务和事件源方面是个新手,我试图找到一种在AWS上部署整个系统的方法。

据我所知,有两种方法可以实现事件驱动架构:

  • 使用AWS运动数据流

因此,我的基本策略是将每个命令转换为存储在DynamoDB中的事件,并利用DynamoDB流将新事件通知其他微服务。但是怎么做?我应该使用前两种解决方案中的哪一种?

第一个具有以下优点:

  • 消息排序

但缺点很成问题:

  • 没有内置自动缩放(可以使用触发器实现)
  • 没有消息可见性功能(显然,要求确认)
  • 没有主题订阅
  • 非常严格的读取事务:您可以使用多个分片来改进它,从我在这里读到的内容来看,您必须有一个定义不明确的lamda数量,具有不同的调用优先级和一个定义不明确的策略,以避免同一微服务的多个实例之间的重复处理。

第二种方法具有以下优点:

  • 完全管理
  • 非常高的TPS
  • 主题订阅
  • 消息可见性功能

缺点:

  • SQS消息是尽最大努力排序,但仍然不知道它们的含义。它表示“标准队列尽最大努力保持消息的顺序,但消息的多个副本可能会按顺序传递”。这是否意味着,与其他消息的副本相比,给一条消息的n个副本,第一个副本按顺序交付,而其他副本按无序交付?或者“不止一个”可以是“全部”

非常感谢您的各种建议!

共有1个答案

益绯辞
2023-03-14
I'm quite a newbe in microservices and Event-Sourcing

回顾Greg Young的演讲Polygot Data,了解以下内容。

跨服务边界共享事件有两种基本方法-推模型和拉模型。对于关心事件顺序的订阅者来说,拉模型更易于维护。

基本思想是每个订阅者跟踪它自己的高水位标记,以了解它处理了流中的多少事件,并查询事件列表的有序表示以获取更新。

在AWS中,您通常通过查询权威服务获取更新的事件列表(其实现可能包括分页)来获得此表示。该服务可以通过直接查询Dynamodb或从DynamoDB获取最新密钥,然后在S3中查找事件的缓存表示来提供事件列表。

在这种方法中,被推出系统的“事件”实际上只是通知,允许订阅者减少写入Dynamo和自己读取之间的延迟。

我通常会使用SNS(扇出)进行广播通知。需要簿记支持的消费者可以使用SQS来处理通知。但传递有序事件的主要渠道是拉。

我自己并没有认真研究动势——在前面的问题中有一些一般性的讨论——但我认为凯文·索科切夫在写作时已经有所收获

...如果你再深入一点,你会发现Kinesis非常适合一个非常特殊的用例,如果你的应用程序不适合这个用例,那么Kinesis可能会带来很多麻烦。

Kinesis的主要用例是收集、存储和处理实时连续数据流。数据流是由数千个数据源连续生成的数据,这些数据源通常以较小的大小(千字节的顺序)同时发送数据记录。

Another thing: the fact that I'm accessing data from another 
microservice stream is an anti-pattern, isn't it?

将系统划分为微服务的部分目的是减少系统功能之间的耦合。跨微服务边界访问数据增加了耦合。所以这里有些紧张。

But basically if I'm using a pull model I need to read 
data from other microservices' stream. Is it avoidable?

如果您查询所需的服务以获取信息,而不是自己从流中挖掘信息,则可以减少耦合——就像向服务请求数据,而不是访问RDBMS并自己查询表。

如果您可以完全避免在服务之间共享信息,那么耦合就会更少。

(天真的例子:订单履行需要知道订单何时付款;因此在付款时需要相关id,但不需要任何其他账单详细信息。)

 类似资料:
  • 我们需要重写具有复杂业务逻辑的旧遗留应用程序。我们考虑使用cqrs和事件源。但是不清楚如何从旧数据库迁移数据。可能我们只需要将其迁移到读取数据库,因为我们不能复制所有事件来填充事件存储。但是我们至少需要在事件存储中为每个聚合创建一些初始记录,例如?或者我们需要编写一个脚本,并使用所有命令一个接一个地重新创建聚合,就像我们通常使用事件源一样?

  • 现在有一些经销商,他们出售的系统是 预装 Debian 或者是其他的 GNU/Linux。 你或许会多付一些,但是买来一份安心,因为可以确保这些硬件能被 GNU/Linux 很好地支持。 如果你不得不购买一台捆绑 Windows 系统的机器,请仔细阅读 Windows 附带的软件协议; 你可以拒绝该协议,并从经销商那里获得一定的折扣。参考 http://www.windowsrefund.net/

  • 现在有一些经销商,他们出售的系统是 预装 Debian 或者是其他的 GNU/Linux。 您或许会多花一些钱,但是买来一份安心,因为这些硬件都已经确保能被 GNU/Linux 很好地支持。 无论是购买一个捆绑 Linux 的系统,还是一个已经用过的系统,检查 Linux 内核是否支持您的 硬件仍然很重要。检查您的硬件是否列在上面的参考资料中。让推销员(或者其他)知道 您是在为一个 Linux 系

  • 现在有一些经销商,他们出售的系统是 预装 Debian 或者是其他的 GNU/Linux。 您或许会多花一些钱,但是买来一份安心,因为这些硬件都已经确保能被 GNU/Linux 很好地支持。 无论是购买一个捆绑 Linux 的系统,还是一个已经用过的系统,检查 Linux 内核是否支持您的 硬件仍然很重要。检查您的硬件是否列在上面的参考资料中。让推销员(或者其他)知道 您是在为一个 Linux 系

  • 我是第一次实施应用内计费,所以我对新购买的东西有点困惑。 如文件所述: 当您调用启动BillingFlow()时,将显示Google Play UI购买屏幕。如果购买订单成功,来自Google Play的响应数据将存储在购买对象中,该对象将传递回相应的侦听器。然后Google Play调用onPurchasesUpdate()方法将购买订单的结果传递给实现PurchasesUpdatedListe

  • 我们有一个设置,其中各种工作节点执行计算并更新DynamoDB表中的相对状态。该表充当工作节点活动的一种历史记录。看门狗节点需要定期扫描表,并构建一个表示工作节点及其作业的当前状态的对象。因此,我们的应用程序能够扫描表并按时间顺序检索数据(即按时间戳排序)是很重要的。表最终会太大,无法扫描到本地内存进行后期排序,所以我们扫描后无法排序。 从AWS留档读取主键: DynamoDB使用分区键值作为内部