我有一个应用程序,其中包含要为其创建绑定的“ID”列表。例如:
输入:
1,2,3,4
创建的绑定(从交换foo
到队列bar
):
foo -> 1 -> bar
[..]
foo -> 4 -> bar
然后我从列表/输入中删除一个项目 (
4
) 并重新启动我的应用程序。 bar
队列是持久的(并且必须保持这种状态),现在我希望删除 4
的绑定。但是:我该怎么做?
有一个queueUnbind方法(https://pkg.go.dev/github.com/rabbitmq/amqp091-go#Channel.QueueUnbind),但这需要我知道routingKey(
4
)才能删除绑定。在这种情况下,我没有状态,所以我不知道哪些(如果有)项目消失了,因此不知道要删除哪些绑定。
我还可以删除
bar
队列,然后使用所有“当前”绑定重新创建它。但这可能会导致仍在该队列上的消息被销毁。我也无法删除 foo
交换,因为它已被其他人使用。
在我的服务中不引入任何状态:如何删除不再需要的绑定?
如果您知道所需的绑定,您可以执行以下操作:
更好的方法可能如下:
当您的应用程序启动/重新启动时,尝试“重新创建”绑定,而不重新创建队列。这样您就可以确定所需的绑定是否存在。 (https://pkg.go.dev/github.com/rabbitmq/amqp091-go#Channel.QueueBind)
当您收到交付时,您可以检查 Delivery 对象的routingkey(如下所示:https://pkg.go.dev/github.com/rabbitmq/amqp091-go#Delivery)。不想要这个路由密钥? Ack 或 Nack 数据包,并在此阶段删除绑定。这样,您的应用程序将在弹出时自动更正“错误”绑定。
这样您的应用程序就不必存储带有绑定(即状态)的文件,并且当旧的/不需要的绑定出现时会自动更正。
您还可以拒绝任何具有您无法识别的路由键的消息,将它们发送到死信队列并添加一个处理程序,该处理程序将自动从那里删除绑定。这样您就不必修改 th 的“消耗”部分中的绑定