SWOOLE 기반 분포 식 SOCKET 메시지 서버 구조

전송:http://blog.molibei.com/archives/105
메시지 서버 는 socket 을 사용 합 니 다.서버 가 과부하 되 지 않도록 한 대 에 500 개의 socket 만 연결 할 수 있 습 니 다.한 대가 부족 할 때 메시지 서버 를 확장 하 는 것 은 필연 적 입 니 다.문제 가 발생 했 습 니 다.어떻게 하면 서로 다른 메시지 서버 에 연 결 된 사용자 가 메 시 지 를 보 낼 수 있 습 니까?
메시지 교환 을 실현 하려 면 반드시 이 메시지 서버 자체 가 서로 통 하도록 해 야 한다.두 가지 방식 을 생각 했다.하 나 는 메시지 서버 간 의 교차 링크 이 고 다른 하 나 는 특수 한 메시지 서버 를 추가 하 는 것 이다.이 메시지 서버 는 대외 적 으로 개방 되 지 않 고 메시지 전송 과 푸 시 만 책임 진다.
다음 테스트 는 방화벽 등 을 고려 하지 않 는 다.타당 성과 효율 만 시험 하 다.
테스트 환경
  • 메시지 서버
    192.168.0.201 9501 
    192.168.0.202 9501
  • 퍼 가기 서버
    192.168.0.203 9501
  • 공공 캐 시
    Redis 192.168.0.231 6379
  • 소프트웨어 환경
    centos 6.5 mini swoole php
  • 흐름 도
  • 전체 흐름 도 는 다음 과 같다.
  • 프로 세 스 설명:client1client2또는 기타client에 메 시 지 를 보 내 고 다른client에 보 낸 메 시 지 를 받 을 수 있 습 니 다.리 트 윗 서버 에서 Redis 가 마 운 트 한 모든 링크 를 지 웁 니 다.
  • 완전한 절차:1.Redisclient에 게 메 시 지 를 보 냅 니 다.3.이 컴퓨터 에 연결 되 어 있 지 않 으 면 메 시 지 를 리 트 윗 서버 에 보 내 고 리 트 윗 서버 에서 이 메 시 지 를 연결 되 어 있 는 메시지 서버 에 보 내 고 메시지 서버 가 메 시 지 를 받 아 전달 합 니 다key.4.메시지 발송 종료.

  • 인 코딩 구현
  • Socket 은 socket 1 에 server.php 를 만 듭 니 다.내용 은 다음 과 같 습 니 다.
      connect("192.168.0.231", 6379);  
      //client
      $proxy = new swoole_client(SWOOLE_TCP | SWOOLE_KEEP);  $proxy->connect("192.168.0.203", 9501);  
      $serv->on('start', function($serv) {
          echo "Service:Start...";
      });  $serv->on('connect', function ($serv, $fd) {
      
      });  $serv->on('receive', function ($serv, $fd, $from_id, $data) {
          global $redis;  
          $data = (array) json_decode($data);      $cmd = $data['cmd'];     switch ($cmd) {          case "login"://  
                  //      
                  $save = array(                  'fd' => $fd,                  'socket_ip' => "192.168.0.201"
                  );              $redis->set($data['name'], serialize($save));              break;          case "chat":              $recv = unserialize($redis->get($data['recv']));              if ($recv['socket_ip'] != "192.168.0.201") {                  //    
                      $data['cmd'] = 'forward';                  $data['recv_ip'] = $recv['socket_ip'];                  $serv->task(json_encode($data));
                  } else {                  //    
                      $serv->send($recv['fd'], "{$data['send']}      :{$data['content']}");
                  }          break;          case "forward"://      
                  $recv = unserialize($redis->get($data['recv']));              $serv->send($recv['fd'], "{$data['send']}      :{$data['content']}");          break;
          }      //$serv->send($fd, 'Swoole: ' . $data);
      });  $serv->on('task', function ($serv, $task_id, $from_id, $data) {
          global $proxy;      $proxy->send($data);
      });  $serv->on('finish', function ($serv, $task_id, $data) {
    
      });  $serv->on('close', function ($serv, $fd) {
          echo "Client: Close.
    ";   });  $serv->set(array('task_worker_num' => 4));  $serv->start();
    socket 2 에 ip 만 변경 하면 됩 니 다.192.168.0.201 이 192.168.0.202 로 변경 되 었 습 니 다.
  • 프 록 시 는 퍼 가기 서버 에 스 크 립 트 proxy.php 를 만 들 었 습 니 다.내용 은 다음 과 같 습 니 다.
     $serv = new swoole_server("0.0.0.0", 9501); //   
     $serv->on('start', function($serv) {
         echo "Service:Start...";
     }); $serv->on('connect', function ($serv, $fd) {
    
     }); $serv->on('receive', function ($serv, $fd, $from_id, $data) {
         global $redis;     $serv->task($data);
     }); $serv->on('task', function ($serv, $task_id, $from_id, $data) {
         $forward = (array) json_decode($data);     $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);     $client->connect($forward['recv_ip'], 9501);     unset($forward['recv_ip']);     $client->send(json_encode($forward));     $client->close();
     }); $serv->on('finish', function ($serv, $task_id, $data) {
    
     }); $serv->on('close', function ($serv, $fd) {
         echo "Client: Close.
    ";  });   $serv->set(array('task_worker_num' => 4)); $serv->start();
  • 테스트
    오픈 순서 주의
    1.퍼 가기 서버 php proxy.php 열기
    2.socket 서버 php server.php 각각 열기
    리 트 윗 서버 에서 두 개의 메시지 서버 가 연결 되 어 있 는 것 을 볼 수 있 습 니 다.3.테스트 를 시작 하고 각각 두 개의 telnet 을 열 어 두 개의 메시지 서버 를 연결 하고 메 시 지 를 보 내 는 테스트:로그 인
    메시지 보 내기 테스트
    소식 이 성공 적 으로 접수 되 었 다.
    강력 한Client1확장 을 바탕 으로 phop 의 효율 적 인 실현 을 가능 하 게 합 니 다.현재 메시지 서버 에서 퍼 가기 서버 까지 는 긴 연결 이 고 퍼 가기 서버 에서 메시지 서버 까지 는 짧 은 연결 이 며 성능 병목 이 존재 하 며 연결 자원 도 낭비 합 니 다.다음 단계 에 성장 연결 을 개조 합 니 다.메시지 서버 의 client 는 이 보 를 사용 합 니 다.

    좋은 웹페이지 즐겨찾기