编程语言
首页 > 编程语言> > 通过Amazon SQS将压缩文本从PHP发送到NodeJS

通过Amazon SQS将压缩文本从PHP发送到NodeJS

作者:互联网

我似乎停留在通过Amazon SQS将压缩消息从PHP发送到NodeJS.

在PHP方面,我有:

$SQS->sendMessage(Array(
    'QueueUrl'    => $queueUrl,
    'MessageBody' => 'article',
    'MessageAttributes' => Array(
        'json' => Array(
            'BinaryValue' => bzcompress(json_encode(Array('type'=>'article','data'=>$vijest))),
            'DataType' => 'Binary'
        )
    )
));

注1:我也尝试将压缩数据直接放在消息中,但是库给了我一些错误的字节数据

在节点方面,我有:

body = decodeBzip(message.MessageAttributes.json.BinaryValue);

消息来自sqs.receiveMessage()调用,该部分有效,因为它适用于原始(未压缩的消息)

我得到的是TypeError:格式不正确

我也试过用:

PHP – NODE

gzcompress() – zlib.inflateraw()

gzdeflate() – zlib.inflate()

gzencode() – zlib.gunzip()

而这些对中的每一对都给了我相同错误的版本(实质上,输入数据是错误的)

考虑到所有这些,我开始怀疑错误是在消息传输中的某个地方

我究竟做错了什么?

编辑1:似乎错误在传输中的某个地方,因为php中的bin2hex()和Node中的.toString(‘hex’)返回完全不同的值.似乎PHP中的Amazon SQS API使用base64传输BinaryAttribute但Node无法对其进行解码.我设法通过关闭amazon aws配置文件中的自动转换然后手动解码节点中的base64来部分解码它,但它仍然无法解码它.

编辑2:我设法通过在php端使用base64_encode()并将base64作为messageBody发送(不使用MessageAttributes)来完成同样的事情.在节点方面,我使用了新的Buffer(messageBody,’base64′),然后使用decodeBzip.这一切都有效,但我仍然想知道为什么MessageAttribute不能正常工作.当前的base64增加了开销,我喜欢按照预期使用服务,而不是通过解决方法.

解决方法:

This就是所有SQS库所做的事情.您可以获取SQS库的php源代码并亲自查看.二进制数据将始终是base64编码(当使用或不使用MessageAttributes时,无关紧要)作为满足具有form-url编码消息的API要求的方式.

我不知道你的$vijest中的数据有多长,但我愿意打赌,在压缩然后base64编码之后它会比以前更大.

所以我对你的回答将是两个部分(如果你真的很顽固,还有三分之一):

>在查看底层原始API时,绝对清楚的是,不使用MessageAttributes不会增加base64的额外开销.相反,由于SQS php库强制执行的数据结构,使用MessageAttributes会增加一些额外的开销.因此,不使用MessageAttributes显然不是一种解决方法,如果您想自己压缩数据并且让它以这种方式工作,您应该这样做.
>由于http POST请求的性质,在应用程序内压缩数据是一个非常糟糕的主意. Base64开销可能会使压缩优势无效,您可能最好不要发送纯文本.
>如果您完全不相信我或API规范或HTTP规范并希望继续,那么我建议在BinaryValue参数中发送一个简单的短字符串’teststring’,并将您发送的内容与您获得的内容进行比较.这将使SQS库对BinaryValue参数的转换变得非常容易理解.

标签:php,node-js,zlib,amazon-sqs
来源: https://codeday.me/bug/20190628/1312430.html