如何在事件驱动架构中执行逻辑操作?

How to perform logical operations in an Event Driven Architecture?

最近我一直在研究与 Kafka 一起使用的事件驱动架构。

由于使用常规微服务并在它们之间直接使用 RPC 之类的东西进行通信,我正在努力了解如何通过事件驱动系统执行相同类型的操作。

我想用一个示例来了解与具有 usersproducts 微服务的事件驱动系统相比如何在编排系统中完成操作。

示例:一家电子商务商店,用户可以在免费计划中拥有 10 件产品,否则在付费计划中可以拥有无​​限数量的产品。

如何在常规的协调服务中完成:

const users = // grpc connection to external users microservice

function createProduct(userId, newProduct) {
  let productsCount = await query("SELECT COUNT(*) FROM products WHERE user_id = " + userId);
  let userIsPaid = await users.getUserIsPaid(userId);

  if productsCount >= 10 && !userIsPaid {
    // Error: cannot make new product because user is on free plan
    return;
  }

  // Go ahead and insert the new product
}

如何在事件驱动系统中完成此逻辑?

我知道产品微服务可以选择存储它需要的数据副本,例如 user_plan,但我想避免这种情况,因为我担心数据会丢失同步和不一致。

即使您的系统使用集成事件,这个特定示例也将完全相同。 Messages/events 用于通知其他服务发生了重要事件。

在此示例中,您只想读取数据并根据数据执行一些业务逻辑。您可以从本地数据库或远程服务读取数据,这是设计选择,两种选择都有利有弊。 Messages/Events不用于读取数据。

Microsoft 有一本关于微服务架构的好书。有几个章节,比如this one关于事件。