>PHP 프레임워크 >Swoole >Swoole을 사용하여 고성능 JSONRPC 서비스를 구현하는 방법

Swoole을 사용하여 고성능 JSONRPC 서비스를 구현하는 방법

王林
王林원래의
2023-06-25 10:24:241299검색

네트워크 개발에서 RPC(Remote Procedure Call)는 원격 프로그램이 서로 호출하여 분산 애플리케이션을 구현할 수 있도록 하는 일반적인 통신 프로토콜입니다. 최근 몇 년 동안 PHP 생태계의 발전이 계속 성숙해짐에 따라 PHP 언어로 고성능 RPC를 구현해야 할 필요성이 점점 더 강해지고 있습니다. PHP 확장으로서 Swoole은 비동기식, 동시성, 고성능 네트워크를 제공합니다. 통신 기능을 갖추고 있으며 고성능 RPC 구현을 위한 최고의 선택이 되었습니다.

이 기사에서는 Swoole을 사용하여 고성능 JSONRPC 서비스를 구현하여 애플리케이션 성능과 처리량을 향상시키는 방법에 중점을 둘 것입니다.

1. JSONRPC 프로토콜 소개

JSONRPC(JavaScript Object Notation Remote Procedure Call)는 JSON 형식을 기반으로 하는 경량 원격 호출 프로토콜로, 다양한 애플리케이션이 번거로움 없이 통신할 수 있도록 통합된 인터페이스 사양 세트를 정의합니다. JSONRPC 프로토콜에서 각 요청과 응답은 JSON 개체이며 둘 다 요청과 응답 간의 해당 관계를 식별하는 id 필드를 포함합니다.

요청 예:

{
    "jsonrpc": "2.0",
    "method": "login",
    "params": {
        "username": "user",
        "password": "pass"
    },
    "id": 1
}

응답 예:

{
    "jsonrpc": "2.0",
    "result": true,
    "id": 1
}

JSONRPC 프로토콜에서 요청자는 메소드 및 매개변수 필드가 포함된 요청을 전송하여 다른 애플리케이션에서 제공하는 원격 서비스를 호출합니다. 통화 결과를 반환합니다. JSONRPC 프로토콜은 일괄 요청 및 일괄 응답을 지원하므로 네트워크 통신 오버헤드를 효과적으로 줄일 수 있습니다.

2. Swoole을 사용하여 JSONRPC 서비스 구현

  1. Swoole 설치

시작하기 전에 먼저 Swoole 확장 프로그램을 설치해야 합니다. 다음 명령을 사용하여 설치할 수 있습니다.

pecl install swoole

php.ini 파일에 다음 줄을 추가하여 설치할 수도 있습니다.

extension=swoole.so

설치가 완료된 후 php -m 명령을 사용하여 swoole 여부를 확인할 수 있습니다. 확장 프로그램이 성공적으로 설치되었습니다.

  1. JSONRPC 서버 구현

간단한 JSONRPC 서버를 구현해 보겠습니다. 구체적인 코드는 다음과 같습니다.

<?php

require_once __DIR__ . '/vendor/autoload.php';

use SwooleHttpServer;
use SwooleHttpRequest;
use SwooleHttpResponse;

$server = new Server('0.0.0.0', 8080);

$server->on('Request', function (Request $request, Response $response) {
    $data = $request->rawContent();
    $arr = json_decode($data, true);
    if (isset($arr['method'])) {
        switch ($arr['method']) {
            case 'login':
                $result = login($arr['params']['username'], $arr['params']['password']);
                break;
            case 'register':
                $result = register($arr['params']['username'], $arr['params']['password']);
                break;
            default:
                $result = ['error' => 'Method not found'];
                break;
        }
    } else {
        $result = ['error' => 'Invalid request'];
    }
    $response->header('Content-Type', 'application/json');
    $response->end(json_encode([
        'jsonrpc' => '2.0',
        'result' => $result,
        'id' => $arr['id']
    ]));
});

function login($username, $password)
{
    // do login
    return true;
}

function register($username, $password)
{
    // do register
    return true;
}

$server->start();

위 코드는 요청 본문을 구문 분석하여 로그인 및 등록 메서드를 처리할 수 있는 JSONRPC 서버를 구현합니다. 해당 메소드를 호출하여 처리하고, 처리 결과는 최종적으로 JSON 형식으로 반환됩니다.

  1. JSONRPC 클라이언트 구현

JSONRPC 서버의 기능을 테스트하려면 JSONRPC 클라이언트도 구현해야 합니다. 구체적인 코드는 다음과 같습니다.

<?php

class JsonRpcClient
{
    private $host;
    private $port;
    private $id;

    public function __construct($host, $port)
    {
        $this->host = $host;
        $this->port = $port;
        $this->id = 0;
    }

    public function send($method, $params)
    {
        $client = new SwooleClient(SWOOLE_SOCK_TCP);
        if (!$client->connect($this->host, $this->port, 0.5)) {
            throw new Exception('Connect failed');
        }
        $client->send(json_encode([
            'jsonrpc' => '2.0',
            'method' => $method,
            'params' => $params,
            'id' => ++$this->id,
        ]));
        $data = $client->recv();
        if (!$data) {
            throw new Exception('Recv failed');
        }
        $client->close();
        $response = json_decode($data, true);
        if (isset($response['error'])) {
            throw new Exception($response['error']['message']);
        }
        return $response['result'];
    }
}

$client = new JsonRpcClient('127.0.0.1', 8080);

try {
    $result = $client->send('login', ['username' => 'user', 'password' => 'pass']);
    var_dump($result);
} catch (Exception $e) {
    echo $e->getMessage();
}

위 코드는 다음으로 보낼 수 있는 요청을 구현합니다. JSONRPC 서버를 호출하고 JSONRPC 클라이언트 응답 결과를 얻습니다. send 메소드를 호출하고 메소드 및 params 매개변수를 전달하면 JSONRPC 서버에 요청을 보내고 응답 결과를 얻을 수 있습니다. 요청이 실패하거나 오류 메시지를 반환하면 예외가 발생합니다.

3. Swoole 기반 JSONRPC 서비스 성능 테스트

Swoole 기반 JSONRPC 서비스의 성능 장점을 검증하기 위해 간단한 성능 테스트를 진행할 수 있습니다. 테스트 환경 구성은 다음과 같습니다.

  • CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
  • Memory: 16GB
  • OS: Ubuntu 20.04.2 LTS
  • PHP 버전: 7.4 .22
  • Swoole 버전: 4.7.1

테스트 방법:

  1. 위에 구현된 JSONRPC 서버 및 클라이언트 코드 사용
  2. ab 명령을 실행하고 1000개의 동시 요청을 시뮬레이션하고 각 요청을 400번 보냅니다. 기록 결과를 테스트하고 비교하십시오.
  3. 테스트 결과는 다음과 같습니다.
Concurrency Level:      1000
Time taken for tests:   1.701 seconds
Complete requests:      400000
Failed requests:        0
Total transferred:      78800000 bytes
Requests per second:    235242.03 [#/sec] (mean)
Time per request:       42.527 [ms] (mean)
Time per request:       0.043 [ms] (mean, across all concurrent requests)
Transfer rate:          45388.31 [Kbytes/sec] received

테스트 결과 Swoole 기반 JSONRPC 서비스는 동시 요청 1000건의 경우 각 요청의 평균 처리 시간이 42.527ms에 불과하며 성능이 매우 뛰어납니다. 요청 처리량이 초당 235242.03회에 도달했습니다.

4. 요약

이 기사에서는 Swoole을 사용하여 고성능 JSONRPC 서비스를 구현하는 방법을 소개하고 성능 테스트를 통해 성능 이점을 입증합니다. 실제 애플리케이션에서는 필요에 따라 복잡한 RPC 서비스를 구현하고 Swoole의 비동기, 동시성 및 고성능 기능을 통해 애플리케이션에 더 나은 성능과 사용자 경험을 제공할 수 있습니다.

위 내용은 Swoole을 사용하여 고성능 JSONRPC 서비스를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.