听取事件,分组和批量提交事件的最佳做法是什么?

时间:2017-07-14 08:03:17

标签: design-patterns database-design bigdata

假设我的系统想要收听用户的点击事件并将其保存到存档存储中。我知道事件的来源(userId - 大约有数百个用户),以及点击的URL。 (网址 - 无限变化)

class ClickEvent {
  String userId;
  String url;
}

如果我的系统每秒可能会收到数千个事件,我不想通过每次点击事件调用一次来将大量负载放入存储中。假设存储是类似AWS S3的存储,或者数据仓库,擅长存储较少数量的商店大文件,而不是每秒提交数万个请求。

我目前的方法是使用GoogleGuava的缓存库。 (或只是具有缓存过期支持的任何缓存)

假设缓存的密钥为userId,缓存的值为List<url>

  • 缓存未命中 - &gt;将条目添加到缓存(userId, [url1])
  • 缓存命中 - &gt;我将新网址添加到列表(userId, [url1, url2...])
  • 缓存条目在自初始写入后或在具有10000个URL之后的可配置X分钟后到期。
  • 在输入到期后,我将数据推送到存储中,理想情况下,最多可将10000个小的单独事务减少到1个大型事务。

我不确定是否有“标准”或更好的方法(甚至是一个众所周知的库)来解决这个问题,即每秒累积数千个事件并将它们全部保存在存储/文件/中数据仓库,而不是将高顶负载转移到下游服务。我觉得这是大数据系统的常见用例之一。

1 个答案:

答案 0 :(得分:0)

我会创建一个eventModule类来获取这些事件并将它们保存在队列中。确保它是单例,以便您可以从代码中的多个位置加载它: https://sourcemaking.com/design_patterns/singleton

然后我会将这些事件设为类类型并使用工厂模式来创建它们: https://sourcemaking.com/design_patterns/factory_method
这样,如果您需要多种事件,您的单身人士将能够处理所有这些事件。

最后,我希望eventModule每隔X秒将这些内容保存到本地存储。每隔Y秒(或队列中的Z事件)我会尝试将它们发送到远程存储。如果可行,请将其从队列中删除。

这将使您在应用程序增长时具有很大的灵活性。