我正在寻找分布式计时器服务。多个远程客户端服务应该能够在指定的时间间隔后注册回调(通过REST apis)。间隔的长度可以是1分钟。我可以忍受大约1分钟的误差。此类回调的数量现在可以达到100,000,但我需要稍后扩大规模。我一直在寻找像Quartz
这样的调度程序,但我不确定它们是否适合这个问题。使用Quartz
,我可能必须在数据库中保存回调请求,并在每分钟轮询100,000行的逾期请求。我不确定会扩大规模。是否有开箱即用的解决方案?否则,我该如何建立一个?
答案 0 :(得分:0)
发表回答,因为我无法发表评论
还需要考虑的另一个选项是消息队列。您发布具有计划延迟的消息的位置,以便消费者可以在该延迟之后消费。
延迟队列允许您推迟在队列中传递新消息达指定的秒数。如果创建延迟队列,则在延迟期间,您发送到该队列的任何消息对于使用者都是不可见的。您可以使用CreateQueue操作通过将DelaySeconds属性设置为0到900(15分钟)之间的任何值来创建延迟队列。您还可以使用SetQueueAttributes操作将现有队列更改为延迟队列,以设置队列的DelaySeconds属性。
Scheduling Messages with RabbitMQ
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/
用户可以使用x-delayed-message类型声明交换,然后使用自定义标头x-delay发布消息,以毫秒为单位表示消息的延迟时间。消息将在x延迟毫秒后传递到相应的队列。
答案 1 :(得分:0)
RocketMQ满足您的要求,因为它支持计划的邮件:
预定邮件与普通邮件的不同之处在于,它们不会 交付,直到稍后的时间。
您可以通过发送以下消息来注册回调:
Message message = new Message("TestTopic", "");
message.setDelayTimeLevel(3);
producer.send(message);
然后,收听此主题以处理您的回调:
consumer.subscribe("TestTopic", "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {...})
除了只能在RocketMQ服务器启动之前定义DelayTimeLevel
选项之外,几乎在所有方面都表现良好,这意味着如果您的MQ服务器具有配置messageDelayLevel=1s 5s 10s
,那么您将无法注册使用delayIntervalTime=3s
进行回调。
Quartz
+存储可以构建您所提到的回调服务,但我不建议您将回调数据存储在关系数据库中,因为您希望它能实现较高的TPS并难以构建分布式服务摆脱了锁定和事务处理,这给数据库编码带来了复杂性。
我确实建议在Redis中存储回调数据。因为它具有比关系数据库更好的性能,并且它的数据结构ZSET
非常适合此场景。
我曾经基于Redis和Dubbo开发了定时回调服务。它提供了一些更有用的功能。也许您可以从中获得一些想法https://github.com/joooohnli/delay-callback