有没有办法在 AMQP 路由键中指定 "not matching"?

Is there a way to specify "not matching" in an AMQP routing key?

我正在使用 RabbitMQ 构建一个系统。我希望能够做的一件事是根据正在记录的消息的严重性将日志消息定向到不同的队列。错误和异常应该进入一个队列,以便立即处理;跟踪日志等不太重要的消息应该放在其他地方,这样它们就不会阻塞关键日志记录。

我想到的处理方式是搭建一个Topic exchange,在exchange上绑定两个队列。然后,我的日志消息将使用它们在路由键中的日志级别来发送到正确的队列。但是,我有一个问题,我不知道设置路由键的最佳方法。

将我的错误放入正确的队列很容易 - 将两个队列绑定到交换器,一个带有 Error 路由键,然后带有 Error 路由键的消息被发送到它。我希望发送到该交换器的所有其他类型的消息都进入另一个队列。但我不认为你可以描述像 !Error 之类的路由键,或者至少它没有出现在我能看到的 RabbitMQ 教程或 AMQP 规范中。如果我使用通配符绑定,那么我的错误消息会传送到两个队列。

看起来我可以通过使用备用交换来完成此操作 (http://www.rabbitmq.com/ae.html) 但如果可能的话我宁愿坚持直接使用 AMQP,并且配置 AE 会给我的系统增加另一层复杂性 初始化。

我还可以为我系统中的 每个 日志级别定义路由键,并显式地将所有不是 Error 的内容路由到低级别队列。但这似乎过于冗长并增加了维护开销。

有没有比使用 AE 更好的方法来实现我的目标?

基本上答案是否定的,路由密钥是不可能的;这只是一个 "match" 的东西,而不是正则表达式或类似的东西。

一侧的路由错误,另一侧的所有内容(包括错误)怎么办?我的意思是,我想您收到的错误消息会比跟踪消息少(我希望如此);您将不得不 "skip" 他们的业务方面,但我认为它比 RabbitMQ 扩展更容易管理。

PS:我能想到的最接近的东西是主题交换,但它也会受到同样的限制。检查 this 以获取更多文档。 PPS: 还有其他SO答案,如果你愿意的话。

希望对您有所帮助:)