如何冻结 SQS 队列以防止任何读取?
How can I freeze an SQS queue against any reads?
我有一个 SQS 队列(标准的,不是 FIFO),我在一个长 运行 进程中用作多个工作人员的任务队列。
我正在尝试添加一个 'kill switch',它会暂时阻止我的工作人员receive/process 发送任何消息。
我不想删除消息或阻止任何新消息进入队列,只是停止所有阅读器,直到我再次切换终止开关。
这可以用SDK做吗?或有权限?
我不知道有 sqs 暂停按钮,而且我没有看到任何看起来很有希望的 sqs API 调用。
您可以从允许读者阅读的 iam 策略中删除访问权限。
您可以在网络级别删除对 sqs public ips 的访问权限。
但我讨厌那些解决方案;它们将失败场景与成功混为一谈,实际上并不比在应用程序中进行编排更优雅或更方便。
我建议我的工程师为此使用功能标志,在 dynamo、consul 或其他一些一致的键值存储中。对我来说比在删除权限或网络访问时允许所有读取连续失败更有意义
有一些未知数,例如您使用的是 java aws 客户端吗?什么版本,这是生产环境还是仅用于 debugging/testing,kill switch 是手动还是自动启动。
基于这里的一些假设是如何完成所要求的。
如果您在 spring java 应用程序中有一个 sqs 侦听器和最新的 aws 客户端,您可以执行如下操作
@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 是否允许该消息在其正确位置重新排队
当您的应用收到来自 "killswitch" 的信号时,您可以 subscribe/unsubscribe。
使用传递延迟设置。
在 AWS 控制台上,您可以编辑队列的配置,并在将消息传送到队列时引入最多 15 分钟的延迟。这样消费者就不会在这段时间内看到消息。
这样你就可以有 15 分钟的时间做任何你想做的清理工作。但如果它需要比这更长的时间,那么你将需要构建一个终止开关。
我们用它来为我们的节点争取时间restarted/redeployed而不影响发布者。
我有一个 SQS 队列(标准的,不是 FIFO),我在一个长 运行 进程中用作多个工作人员的任务队列。
我正在尝试添加一个 'kill switch',它会暂时阻止我的工作人员receive/process 发送任何消息。
我不想删除消息或阻止任何新消息进入队列,只是停止所有阅读器,直到我再次切换终止开关。
这可以用SDK做吗?或有权限?
我不知道有 sqs 暂停按钮,而且我没有看到任何看起来很有希望的 sqs API 调用。
您可以从允许读者阅读的 iam 策略中删除访问权限。
您可以在网络级别删除对 sqs public ips 的访问权限。
但我讨厌那些解决方案;它们将失败场景与成功混为一谈,实际上并不比在应用程序中进行编排更优雅或更方便。
我建议我的工程师为此使用功能标志,在 dynamo、consul 或其他一些一致的键值存储中。对我来说比在删除权限或网络访问时允许所有读取连续失败更有意义
有一些未知数,例如您使用的是 java aws 客户端吗?什么版本,这是生产环境还是仅用于 debugging/testing,kill switch 是手动还是自动启动。
基于这里的一些假设是如何完成所要求的。
如果您在 spring java 应用程序中有一个 sqs 侦听器和最新的 aws 客户端,您可以执行如下操作
@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 是否允许该消息在其正确位置重新排队
当您的应用收到来自 "killswitch" 的信号时,您可以 subscribe/unsubscribe。
使用传递延迟设置。
在 AWS 控制台上,您可以编辑队列的配置,并在将消息传送到队列时引入最多 15 分钟的延迟。这样消费者就不会在这段时间内看到消息。
这样你就可以有 15 分钟的时间做任何你想做的清理工作。但如果它需要比这更长的时间,那么你将需要构建一个终止开关。
我们用它来为我们的节点争取时间restarted/redeployed而不影响发布者。