如何在事件驱动架构中执行逻辑操作?
How to perform logical operations in an Event Driven Architecture?
最近我一直在研究与 Kafka 一起使用的事件驱动架构。
由于使用常规微服务并在它们之间直接使用 RPC 之类的东西进行通信,我正在努力了解如何通过事件驱动系统执行相同类型的操作。
我想用一个示例来了解与具有 users
和 products
微服务的事件驱动系统相比如何在编排系统中完成操作。
示例:一家电子商务商店,用户可以在免费计划中拥有 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关于事件。
最近我一直在研究与 Kafka 一起使用的事件驱动架构。
由于使用常规微服务并在它们之间直接使用 RPC 之类的东西进行通信,我正在努力了解如何通过事件驱动系统执行相同类型的操作。
我想用一个示例来了解与具有 users
和 products
微服务的事件驱动系统相比如何在编排系统中完成操作。
示例:一家电子商务商店,用户可以在免费计划中拥有 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关于事件。