gpt4 book ai didi

design-patterns - 监听事件、将事件分组并批量提交的最佳实践是什么?

转载 作者:行者123 更新时间:2023-12-03 17:37:36 26 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

2年前关闭。




Improve this question




假设我的系统想要监听用户的点击事件并将它们保存到存档存储中。我知道事件来自哪里(userId - 大约数百个用户),以及点击了什么 URL。 (网址 - 无限变化)

class ClickEvent {
String userId;
String url;
}

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

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

假设缓存的键是 userId , 缓存值为 List<url> .
  • 缓存未命中 -> 向缓存添加条目 (userId, [url1])
  • 缓存命中 -> 我将新 URL 添加到列表 (userId, [url1, url2...])
  • 缓存条目在自初始写入或拥有 10000 个 URL 后可配置的 X 分钟后到期。
  • 条目到期后,我将数据推送到存储中,理想情况下,将最多 10000 个单独的小事务减少到 1 个大事务。

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

    最佳答案

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

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

    最后,我会让 eventModule 每 X 秒将这些保存到本地存储中。每 Y 秒(或队列中的 Z 个事件),我都会尝试将它们发送到远程存储。如果有效,请将它们从队列中删除。

    当您的应用程序增长时,这将为您提供很大的灵活性。

    关于design-patterns - 监听事件、将事件分组并批量提交的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45097806/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com