我正在构建一个向外部系统发送命令的系统(全部相同,但是具有不同的位置和ID)。
命令被发送到FIFO SQS队列,并且外部系统从该队列中读取和删除。
当前的计划是为每个外部系统创建一个队列,因此我只需要一个Lambda即可在更改系统的数据库表时更新队列列表。
但是我可以看到SQS FIFO支持消息组ID,所以我想知道我是否应该只有一个队列,其中所有系统仅从它们自己的消息组ID中读取。
我喜欢此解决方案的简单性-但是,我看不到一种限制访问权限以读取和删除特定消息组的消息的方法,这意味着,如果一个外部系统受到威胁,则可以使用其凭据来劫持所有外部系统的共享队列,因此删除所有内容。
是否有解决方法,所以我可以通过任何方式为特定队列和消息组ID设置一些权限?
我也担心缺少清除一组消息而不是清除整个队列的选项。
答案 0 :(得分:1)
您无法从FIFO队列中的特定消息组“读取”,并且没有相关权限。
消息组是不透明的标签,告诉FIFO队列是否必须以相对于彼此的严格FIFO顺序将任何两个消息传递给使用者。如果两条消息共享相同的消息组,则必须严格地对其进行排序,但是不必严格地对具有不同消息组ID的两条消息进行排序。
此功能允许在存在并行的相同使用者时更快地整体处理消息,因为如果没有此功能,则任何时候只有一个使用者可以处理消息,并且队列的总体吞吐量将受限于单个消息的处理速度消费者可以处理一条消息(因为只要有一条消息正在发送,就不会将任何消息传递给另一个消费者)。
邮件组ID
用于指定消息属于特定消息组的标签。属于同一个消息组的消息始终按照相对于该消息组的严格顺序进行逐一处理(但是,属于不同消息组的消息可能会无序处理)。
[...]
如果您需要一组有序消息,请为发送到FIFO队列的消息提供相同的消息组ID。
https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html
还请注意,尽管ReceiveMessage
API允许您要求随每条消息一起返回message-group-id,但是它没有规定要指定您要从中接收消息的message-group-id,因为这不是此功能的目的。