阿里云物联网服务端订阅问题

德玛西亚

问题描述

我在开发阿里云物联网的服务端订阅功能,听阿里云的工作人员只能通过/topic/#,来获取获取所有的设备发送的信息,如果我有几千台设备同时发送信息,同时都到这一个接口来区分和保存信息会不会并发很严重,请问大佬们有什么解决办法吗,现在服务器是16核的,我该如何优化我的代码呢?

 public function onWorkerStart()
{
        $accessKey = config('api.iot.aliyun_accessKeyId');
        $accessSecret = config('api.iot.aliyun_secretKey');
        $consumerGroupId = "DEFAULT_GROUP";
        $clientId = $this->uuid();
        //iotInstanceId:实例ID。
        $iotInstanceId = config('api.iot.iot_id');
        $timeStamp = round(microtime(true) * 1000);
        //签名方法:支持hmacmd5,hmacsha1和hmacsha256。
        $signMethod = "hmacsha1";
        //userName组装方法,请参见AMQP客户端接入说明文档。
        //若使用二进制传输,则userName需要添加encode=base64参数,服务端会将消息体base64编码后再推送。具体添加方法请参见下一章节“二进制消息体说明”。
        $userName = $clientId . "|authMode=aksign"
            . ",signMethod=" . $signMethod
            . ",timestamp=" . $timeStamp
            . ",authId=" . $accessKey
            . ",iotInstanceId=" . $iotInstanceId
            . ",consumerGroupId=" . $consumerGroupId
            . "|";
        $signContent = "authId=" . $accessKey . "&timestamp=" . $timeStamp;
        //计算签名,password组装方法,请参见AMQP客户端接入说明文档。
        $password = base64_encode(hash_hmac("sha1", $signContent, $accessSecret, $raw_output = TRUE));
        $client = new Client('stomp://'.config('api.iot.amqp').":61614", array(
            'debug' => true,
            'login'      => $userName,
            'passcode'   => $password,
            ['ssl' => ['verify_peer' => true, 'verify_peer_name' => false]]
        ));
        $client->onConnect = function(Client $client) {
            $client->subscribe('/topic/#', function(Client $client, $data) {
                print_r($data);
               $body =  json_decode($data['body'],true);
            });
        };
        $client->onError = function ($e) {
            echo $e;
        };
        $client->connect();
}

public function  uuid()
{
    $chars = md5(uniqid(mt_rand(), true));
    $uuid = substr ( $chars, 0, 8 ) . '-'
        . substr ( $chars, 8, 4 ) . '-'
        . substr ( $chars, 12, 4 ) . '-'
        . substr ( $chars, 16, 4 ) . '-'
        . substr ( $chars, 20, 12 );
    return $uuid ;
}
'sub_ali' => [
    'handler'  => app\api\SubAli::class,
    'count'   => 4,
],
159 1 0
1个回答

walkor

每个设备启动时间不一样,应该不会同时向服务端发送数据,除非服务端给所有设备推送了某种指令,指令让所有设备立即上报数据给服务端,这样可能会同时收到所有设备发来的数据。如果没有后者这样的情况,基本不用担心

  • 德玛西亚 22天前

    谢谢大佬回答我的问题, 请问16核的服务器,就像这种接口,每秒能处理多少条数据呢,会不会丢失数据呢?

  • walkor 22天前

    能处理多少要自己压测

🔝