【发布时间】:2017-03-13 19:12:39
【问题描述】:
我需要一个关于如何分发聚合更新的好主意...
假设我有一个 Id 的 IObservable 和一个产生永无止境的消息流的值(5-10,000/秒)。现在我想计算很多聚合(例如总和) 定期分发到其他系统 - 假设每个聚合每 10 秒一次。 聚合基于元组的 ID(字符串),但可能会落入多个聚合(聚合定义应包含哪些 id - 因此会重叠)。
会有几千个聚合定义,那么有人对如何解决这个问题有任何想法吗?
概念上:
public struct Update
{
public string Id { get; }
public int Value { get; }
}
public class Aggregate
{
Dictionary<string, Update> latestValues = new Dictionary<string, Update>();
public void AddUpdate(Update update)
{
latestValues[update.Id] = update;
}
public int CalculateSum()
{
return latestValues.Values.Select(v => v.Value).Sum();
}
}
更新:
这个问题的目的是为了简化真正的问题——也许我没有做得那么好——很抱歉。 假设我有多个 IOT 设备产生温度并定期报告该温度(更新流)。然后不同的用户可以选择查看设备子集的聚合(例如平均值)值。因此,一位客户可能希望查看设备 1、2 和 3 的平均值,而另一位客户可能希望查看设备 2、3 和 4 的平均值等(聚合定义)
【问题讨论】:
-
聚合组键是否总是等于
Id,并且单个消息只能属于单个聚合组? -
我们可以得到一个 mcve 吗? stackoverflow.com/help/mcve
-
你的意思是
10.000是一万还是十个小数点后三个零? -
抱歉,欧洲小数点不正确 - 我已将其更正为一万。一条消息可以属于多个聚合组,这使得它变得更加复杂
-
@supertopi,我认为这种情况下的聚合是
Sum、Min、Max等聚合操作,而不是 DDD 聚合。 (嗯,这就是我最初阅读它的方式)。所以我认为这很简单“如何使用 Rx 创建高流量读取模型?”。而且我想在出现已知的性能问题之前,答案就是每个聚合操作都订阅并更新其状态。
标签: .net aggregate system.reactive observable