2016-12-29 19 views
0

我有一个SQS队列(标准,而不是FIFO),我正在使用长期运行过程中的多个工作人员的任务队列。如何冻结SQS队列以防读取?

我试图添加一个'kill switch',它会暂时阻止我的工作人员能够接收/处理任何消息。

我不想删除邮件或停止任何新邮件进入队列,只要停止任何阅读器,直到我再次切换kill命令为止。

这可能与SDK有关吗?或与权限?

回答

3

我不知道一个sqs暂停按钮,我没有看到任何看起来很有前途的sqs API调用。

您可以从iam政策中删除访问权限,以便读者阅读。

您可以在网络级别删除对sqs public ips的访问。

但我讨厌那些解决方案;他们模仿成功的失败场景,并没有比编排应用程序更优雅或方便。

如果建议我的工程师为此使用功能标志,请在发电机,领事或其他一致的键值存储中使用。对于我来说,比允许所有读取连续失败,同时删除权限或网络访问更有意义

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是否允许该消息重新排列在适当的位置

+0

除了新的FIFO队列之外,平方队列本身是无序的。这看起来像是一种昂贵且不雅的方法,只是在禁用开关之前进行颠簸,但听起来它会起作用,并且支持代码包含。 –

+0

@Dan Farrell我会同意这绝对不是以任何方式解决问题的方法 –