域驱动程序设计中的规则引擎(以速率限制器为例)

时间:2018-01-24 16:05:28

标签: akka domain-driven-design

将规则引擎集成到域驱动程序设计中的好方法是什么? 举个例子:如果我有一个通用的速率限制服务,那就是

  • 资源(广告,机器等),包含属性("类别","所有者"等)
  • 活动(广告视图,广告点击等)。每个事件都有一个关联的用户和资源(用户X在事件Y上执行)
  • 限制:例如"每天最多5个娱乐广告"或者"每小时最多2次显示广告X" 域比这更丰富,但这应该足够用于示例。

似乎有3个聚合:资源,事件,限制。但是,评估用户的限制需要收集用户执行的所有(a)事件,(b)所有资源,(c)所有限制,然后评估规则。所以这个规则引擎'组件需要保持有关所有聚合的知识。

设计它的一种方法是拥有一个规则引擎" Saga"每个请求/用户,收集聚合中的所有信息并评估规则。有人可以提出另一种设计吗?

P.S 我正在使用Akka,所以上面的设计非常适合演员每次请求。

2 个答案:

答案 0 :(得分:1)

另一种方法是保持你的规则引擎"不知道任何特定的聚合,而是保持所有数据相关。

您可以传递所需的"参数"到规则引擎来评估给定的"表达式#34;或"方法"各种各样的。例如:

方法:"速率限制器" 参数:

  • " AdClickCount":10
  • "类别":"袜子"

规则引擎会使数据返回所需的响应。

这些是广泛的。我为保险公司实施了类似的措施,以根据与各种产品相关的许多规则来确定保费。

我正在开发一个开源版本,但我没有足够的时间来完成,但也许有一些想法:https://github.com/Shuttle/Shuttle.Abacus

答案 1 :(得分:0)

假设您有一个应用程序并且需要限速:

应将速率限制视为另一个有界上下文。它可能有两个方面:

  • 管理部分,其中添加,编辑和删除资源和规则以及
  • 验证部分,接受操作(并且计数器递增)或拒绝;对于这两者,您可以包含解释性消息,即RetryAfter: 10 secondsRemaining: 99

验证限制取决于您的体系结构。例如,如果您使用API​​网关和微服务,则对于每个操作(ad viewad click),API网关会根据速率限制微服务检查请求。

P.S。我不能给你一个通用的答案,这取决于每个用例。