我在开发阿里云物联网的服务端订阅功能,听阿里云的工作人员只能通过/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 . "×tamp=" . $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,
],
每个设备启动时间不一样,应该不会同时向服务端发送数据,除非服务端给所有设备推送了某种指令,指令让所有设备立即上报数据给服务端,这样可能会同时收到所有设备发来的数据。如果没有后者这样的情况,基本不用担心
谢谢大佬回答我的问题, 请问16核的服务器,就像这种接口,每秒能处理多少条数据呢,会不会丢失数据呢?
能处理多少要自己压测