2016-03-17 81 views
2

我正在使用RabbitMQ构建一个系统。我希望能够做的事情之一是根据记录的消息的严重性将消息直接记录到不同的队列中。错误和异常应该到一个队列立即处理; Trace跟踪日志等不太重要的消息应该到别的地方,所以它们不会堵塞关键日志记录。有没有办法在AMQP路由键中指定“不匹配”?

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

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

它看起来像我可以使用备用交易所(http://www.rabbitmq.com/ae.html)做到这一点,但我宁愿用直AMQP如果可能的话坚持和配置不良事件增加了复杂性的另一层我的系统 初始化。

我也可以在我的系统定义路由键日志级别,而不是Error低级别的队列明确路线的一切。但是这似乎过于冗长,并增加了维护开销。

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

+0

的AE也失败了/是一个贫穷的choce因为任何的匹配就会阻止一个AE消息 - 观察与另一个结合,等等,将改变交流的非常行为预期的行为。 – user2864740

+0

从现在开始,键*必须*用于小的区分集合,并且这些*必须*被明确绑定:无论是或者无法'限制'绑定。这是非常不幸的,我很惊讶这没有适当的解决方案。虽然有人会认为它不是“AMQP 0-9-1”,但具有形成负值集的能力在真实代码中非常非常方便。拥有更灵活的路由器非常方便,我很乐意交易更多的ms /消息。 – user2864740

+0

(也就是说,不幸的是没有可以应用于比赛的'后卫'条件:扩展可能能够做到这一点?) – user2864740

回答

2

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

路由错误一方面,另一方面的一切(包括错误)呢?我的意思是,我想你的错误信息会少于跟踪信息(我希望至少)。你将不得不“跳过”他们的业务,但我认为它比RabbitMQ扩展更容易管理。

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

希望它能帮助:)