前面讲过fanout,direct,topic exchange的使用,还有一个headers类型的exchange未提到如何使用它,现在我们就来看看header exchange该如何使用以及在哪些场景下使用这种类型的exchange。
Headers
headers exchange主要通过发送的request message中的header进行匹配,其中匹配规则(x-match)又分为all和any,all代表必须所有的键值对匹配,any代表只要有一个键值对匹配即可。headers exchange的默认匹配规则(x-match)是any。
sender.go
声明exchange
发送message
辅助函数bodyFrom()
receiver.go
同样的声明exchange(略)
声明queue以及binding queue
注意之前我们的QueueBind时args这个参数都是nil,现在就需要用到这个参数进行bind。这里receiver.go中的Channel.QueueBind()表达的意思是对于发送过来的消息,只要和table["user"]="lyx"或者table["name"]="hei"任意一个键值对匹配就会被接收。如果x-match为all,那么必须满足table["user"]="lyx"和table["name"]="hei"两个键值对都匹配时才会被接收(尽管受到的message中的header数量可能大于2个,但是只要其中任意2个和table中的值完全相等就会匹配成功)。
从queue的一个channel中接收消息
producer.go
consumer.go
现在我们将receiver.go中的table做一些修改:
将x-match从any修改为all,重新编译运行,然后在producer那里发送一条消息,会发现consumer接收不了这条消息,是因为producer那里的headers里面没有包含name-hei这个键值对。所以不匹配导致consumer这边没收到任何消息。
网友评论