有没有办法在AMQP路由密钥中指定“不匹配”?

时间:2016-03-17 15:40:25

标签: rabbitmq

我正在使用RabbitMQ构建一个系统。我希望能够做的事情之一是根据记录的消息的严重性将日志消息直接发送到不同的队列。错误和异常应该进入一个队列以便立即处理;像Trace日志这样不太重要的消息应该转移到其他地方,因此它们不会阻塞关键日志记录。

我认为处理此问题的方法是设置主题交换并将两个队列绑定到交换机。然后,我的日志消息将使用路由密钥中的日志级别发送到正确的队列。但是,我有一个问题,我不知道设置路由密钥的最佳方法。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

一方面路由错误,另一方面一切(包括错误)怎么办?我的意思是,我想你的错误消息比跟踪消息少(我希望至少);你必须“跳过”他们的业务方面,但我认为它比RabbitMQ扩展更容易管理。

PS:我能提出的最接近的东西是Topic Exchange,但它会受到同样的限制。查看this以获取更多文档。 PPS:如果你愿意,还有this其他SO答案。

希望有所帮助:)