Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 让SQS工作人员知道时区_Php_Algorithm_Amazon Sqs_Worker - Fatal编程技术网

Php 让SQS工作人员知道时区

Php 让SQS工作人员知道时区,php,algorithm,amazon-sqs,worker,Php,Algorithm,Amazon Sqs,Worker,问题陈述 我有一个cron,它将工作排队给工人。工作人员向用户发送电子邮件。这些工作是为不同的国家排队的。每个国家的电子邮件只能在上午11点到下午5点之间发送,即在澳大利亚时间,发送给澳大利亚用户的电子邮件只能在上午11点到下午5点之间发送,其他所有国家的情况也是如此 我尝试过的 每个乔布斯都知道自己的时区。在读取作业时,如果作业与时间要求不匹配,则会将其从队列中删除并添加延迟。延迟是根据下一个可接受时间帧到当前时间的差值计算的 但这种解决方案的问题是,延迟通常在17-18小时内。亚马逊的SQS

问题陈述

我有一个cron,它将工作排队给工人。工作人员向用户发送电子邮件。这些工作是为不同的国家排队的。每个国家的电子邮件只能在上午11点到下午5点之间发送,即在澳大利亚时间,发送给澳大利亚用户的电子邮件只能在上午11点到下午5点之间发送,其他所有国家的情况也是如此

我尝试过的

每个乔布斯都知道自己的时区。在读取作业时,如果作业与时间要求不匹配,则会将其从队列中删除并添加延迟。延迟是根据下一个可接受时间帧到当前时间的差值计算的

但这种解决方案的问题是,延迟通常在17-18小时内。亚马逊的SQS最大延迟为15分钟。一种解决方法是每次将作业延迟5分钟,但效率低下,因为在这17-18小时内,同一个作业会被选中数次

另一个效率极低的解决方案是每个国家有多个工人

目前,对于同一命令,我有多个cron条目,用于在可接受的时间对作业进行排队,即澳大利亚作业在上午11点排队,因为澳大利亚作业的cron行设置为上午11点


我正在寻找一个有效的机制来解决这个问题。欢迎提出任何意见。有人能帮帮我吗?另外,解决这类问题的标准方法是什么?

您可以更改消息,而不是从队列中删除消息

此操作使消息处于“正在运行”状态,等待您删除它(您实际上不会这样做),或者直到达到可见性超时。当超时过期时,邮件将离开“飞行中”状态,并立即有资格再次发送。。。此时,您的工作人员将再次收到它,并可以决定是否对其进行操作,或再次重置可见性超时

以下是一些限制和注意事项:

  • 可视性超时的最长时间为12小时——这不是一个严重的限制,因为最坏的情况是,在它符合交付条件之前,您必须再处理一次

  • 如果您使用的是死信队列,则传递的计数器必须足够高,以使这些更改可见性的操作不会过早地将消息发送到死信队列,因为这将使每条消息的大约接收计数在其可见性超时到期时增加1。这也是一个小问题

  • 主要考虑事项:队列在任何时候都有120000条消息的限制。由于此操作使消息处于“正在运行”状态,因此如果您希望让那么多消息等待其处理窗口到达,则此解决方案将崩溃。一旦您有那么多的消息在飞行中,您的长时间轮询将失败,直到部分消息再次可见,因为接收更多消息将使您的飞行中计数器超过允许的最大值120000。如果您的音量远低于此值,则解决方案应该可以


请注意,我不是建议更改队列的可见性超时,而是向SQS发送一个请求,以更改要延迟处理的每条消息的可见性超时。

非常感谢Michael的回答。此外,除了可见性超时之外,您还可以建议其他方法来处理该问题吗?将“保存以备以后使用”消息存储在数据库中,计划交付时间存储在带有索引的列中,并从SQS中删除。在每轮SQS轮询之后,检查数据库中是否有传递时间