【问题标题】:Aerospike TTL listenerAerospike TTL 监听器
【发布时间】:2016-04-08 07:41:37
【问题描述】:

我正在使用 Aerospike 进行 POC。它似乎满足了我的所有需求,除了一个。当我在记录上设置 TTL 时,它会在 TTL 按预期过期后过期,但我有一个要求,我希望 aerospike 在记录被驱逐时通知我。这可能吗?

【问题讨论】:

    标签: java aerospike ttl


    【解决方案1】:

    您可以通过UDF获取记录TTL并与当前时间进行比较

    这里给出了一个骨架 UDF:

    本地函数 get_metadata(rec) 返回记录.ttl(rec); 结束

    https://discuss.aerospike.com/t/how-to-query-the-metadata-such-as-ttl-of-record-from-tools/916

    如果您定期为每条记录执行此操作,我怀疑这将占用大量资源,但您可以让您的应用程序每隔一段时间运行该 UDF 并在记录接近到期时发出 ping 通知。

    如果您正在查看更一般的级别,您可以 grep NSUP 的日志(这是处理过期和驱逐的子系统),并且有一条清晰的日志消息指示 NSUP 何时删除记录。

    【讨论】:

      【解决方案2】:

      Aerospike 不会开箱即用地为您执行此操作。您可以通过运行定期扫描作业来做到这一点。在扫描策略中,您可以将 includeBinData 设置为 false。这将是一个非常有效的扫描,因为它只会返回记录的元数据。在元数据中,您可以检查 ttl 并读取即将到期的完整记录。

      【讨论】:

        【解决方案3】:

        感谢您对 Aerospike 的关注。 您希望 Aerospike 如何通知您?

        我们已经提出这个要求很长时间了,并且已经考虑了实施。分布式系统中存在许多问题。

        例如,我们可以将日志文件条目写入特殊的“过期文件”。当然,当服务器崩溃时,这些数据可能会丢失,因此不是多余的。

        另一种机制是插入队列,或执行网络事件(REST 调用)。这还需要一个分布式日志来确保通知不会被丢弃(Aerospike 使用它的跨数据中心功能做到了这一点)。

        因此,我对您想要的那种通知机制很感兴趣。

        Ben Bates 建议的方法是使用 Scan UDF 函数将过期时间移到此类 UDF 扫描中。然后,在 UDF 中,您也可以通知。这应该可以,但是您需要将 TTL 放在一个 bin 中,而不是使用标准的 TTL 机制。这肯定会比 C 中的标准 TTL 机制效率低,但可能会提供您所需要的。

        【讨论】:

        • 一个 REST 调用会很棒。
        • 请与 Redis 进行比较。您可以使用事件通知启动 redis,您可以配置您希望 Redis 服务器通知哪些类型的事件(如写入、读取、到期等),这样您就可以订阅您的服务器,当有事情发生时,您的事件处理程序被触发。像这样的东西对于 aerospike 非常有用。我正在考虑使用 aerospike,但这对我来说是一个要求,我不能支付每次查询的代价来检查即将过期的内容,也不能解析日志。性能不好,是业余的解决方案。
        • @CesarVillasana 好吧,有人必须定期检查密钥是否即将过期,无论是在数据库还是在客户端完成,这都是超级非最佳的。 Redis 实现了密钥过期的半被动方式,这就是为什么只有在密钥被删除时才会收到过期事件,而不是在过期时。
        • “超级非最优”。不是真的,Aerospike 有效地使密钥过期。如果你读或写它会被检查,如果你不读或写,它会定期检查。这些是高效的 RAM 索引,即使每个用户拥有数十亿个密钥,运行它们也不会太糟糕。 Aerospike 的事件通知系统刚刚进入抢先体验;如果您有兴趣,请与他们联系。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2013-12-24
        • 2014-12-13
        • 2014-02-21
        • 1970-01-01
        • 2017-01-10
        • 2021-07-02
        相关资源
        最近更新 更多