我有一个SQS队列(标准,而不是FIFO)我在长时间运行的进程中用作多个worker的任务队列。
我正在尝试添加一个'kill switch',它会暂时阻止我的工作人员接收/处理任何消息。
我不想删除邮件或阻止任何新邮件进入队列,只需停止任何读者,直到我再次切换kill开关。
这可能与SDK有关吗?还是有权限?
答案 0 :(得分:4)
我不知道sqs暂停按钮,我没有看到任何看起来很有希望的sqs API调用。
您可以从iam政策中删除访问权限,以便读者阅读。
您可以在网络级别删除对sqs public ips的访问权限。
但我讨厌那些解决方案;它们成功地模糊了失败场景,并且在应用程序中编排时并不比它更优雅或更方便。
如果建议我的工程师在发电机,领事或其他一致的键值存储中使用功能标志。对我来说比让权限或网络访问被删除时允许所有读取连续失败更有意义
答案 1 :(得分:1)
有一些未知数,例如你使用的是java aws客户端吗?什么版本,这是一个生产环境,还是只是用于调试/测试,是杀手开关手册还是自动启动。
基于这里的一些假设是如何完成所要求的。
如果你在带有最新aws客户端的spring java应用程序中有一个sqs监听器,你可以做类似下面的事情
@SqsListener(value = mySqsQueueNameHere", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void onMessage(String payloadStr, Acknowledgment acknowledgement) throws InterruptedException, ExecutionException, JsonParseException, JsonMappingException, IOException {
if(isKillSwitchOn) throw new SomeExceptionHere();
.....rest of code here if kill switch not on....
}
当抛出任何异常时,SqsMessageDeletionPolicy.ON_SUCCESS
将消息放回队列。 SqsListener只接受队列名称列表和删除策略我没有看到关闭监听器的干净方法
这样可以防止消息被消耗然后被删除但是会被警告您的侦听器将继续从队列中取消消息,但是它会立即将消息丢回。我也不确定队列排序如何影响不确定SQS是否会允许该消息在正确的位置重新排队
答案 2 :(得分:0)
当您的应用收到“ killswitch”发出的信号时,您可以订阅/取消订阅。
答案 3 :(得分:0)
使用投放延迟设置。
在AWS控制台上,您可以编辑队列的配置,并在将消息传递到队列中引入最长15分钟的延迟。这样,消费者在此期间将不会看到该消息。
这样,您可以有15分钟的时间进行所需的清理。但是,如果要花更长的时间,那么您将需要构建一个kill开关。
我们以此为购买时间来重新启动/重新部署节点,而不会影响发布者。