当前位置: 首页 > 后端技术 > PHP

rabbitmq发送的消息格式注意

时间:2023-03-30 00:02:46 PHP

事故原因消息没有声明content_type属性,导致获取数据失败被当作字节数组处理。消费端消费端由Java开发。因为没有声明content_type,Java开发的应用程序框架可能会将这个payload当成一个字节数组,这显然会导致错误。因为之前的约定是字符串格式,而不是字节数组。正确的做法是在生产者下发消息时添加消息属性“content_type”,声明为text/plain$message=newAMQPMessage($this->body,['content_type'=>'text/plain','delivery_mode'=>2]);$this->channel->basic_publish($message,$this->bindings[$this->action]['exchangeName']);其实加上这个'content_type'=>'text/plain',应该是让PHP告诉rabbitmq把消息以字符串的格式存储,这样Java端的底层框架才能正确的把数据转换成有效的string进行处理,否则默认按字节数组处理。(当然这要看Java程序使用的框架,有的框架接口可能会把数据格式预处理成字符串,有的可能会处理成字节数组,我猜最原始的形式也是字节数组。)总结经验可能经常是Ignorethiscontent_type,记得定义消息为persistent即可。因为简单的考虑了PHP生产,PHP消费的情况不需要处理。可能是PHP的底层框架已经实现了(可能AMQP扩展包可以默认将payload转成字符串,在MQ控制台也可以看到message,会有一个字"Encoding:自动字符串/base64”)。所以当涉及到多系统(尤其是多种不同编程语言)的开发时,一定要定义好payload的content_type属性。其实在涉及到数据通信和交互的场景中,需要声明这样的契约,养成良好的习惯。有效负载也可以在此处了解有效负载。首先你要知道AMQPMessage消息包括两部分,1消息属性和2负载。可以类比HTTP请求头和请求体的理解。1message属性栏是PHP版本的AMQP包定义属性名。其他编程语言可能有不同的定义,但在AMQP类别中是一致的)'content_type'=>'shortstr','content_encoding'=>'shortstr','application_headers'=>'table_object',#是header在WebUI控制台中显示'delivery_mode'=>'octet','priority'=>'octet','correlation_id'=>'shortstr','reply_to'=>'shortstr','expiration'=>'shortstr','message_id'=>'shortstr','timestamp'=>'timestamp','type'=>'shortstr','user_id'=>'shortstr','app_id'=>'shortstr','cluster_id'=>'shortstr',2payload(即webUI控制台显示的payload),其实是messagebody的一部分,只是在AMQP中不叫body,叫payload,不过你可以理解为这个意思邮件正文。AMQP代理将其视为不透明字节数组(byte[]),即AMQP代理不检查或修改消息的有效负载。AMQP消息可能只包含属性而没有有效载荷、有效载荷而没有属性,或者两者都不包含。一般在不设置content_type属性的情况下,底层程序处理payload的默认类型应该是byte数组(推断,没有实际测试验证)。通常使用JSON、Thrift、ProtocolBuffers和MessagePack等序列化格式对数据进行序列化和结构化,以便将其作为消息负载发布。一般约定下,消息属性中的Contenttype和Contentencoding一般可以指明其序列化方式。通常,生产者和消费者在开发程序应用时是解耦的,可能涉及相同的编程语言和不同的编程语言。有可能生产者是PHP开发的,消费者程序是Java、Python等开发的,这时候声明消息的Content_type就显得尤为重要。这是一种契约。当发布的消息没有描述消息的内容时,应用程序往往会使用隐式契约来处理,这可能会导致错误。参考https://www.jianshu.com/p/48c57d3a6acdhttps://juejin.im/post/5e3e1e54518825496452a31ehttps://blog.csdn.net/Sadlay/article/details/86716028?depth_1-utm_source=distribute.pc_relevant。none-task&utm_source=distribute.pc_relevant.none-task写在开发过程中遇到的一些问题的最后。这绝不是官方的解释。如有不妥之处,欢迎指正,共同讨论。互相学习,共同进步。目的。