SWOOLE 기반 분포 식 SOCKET 메시지 서버 구조
5169 단어 swoolesocket분포 식사이트 구조 디자인
메시지 서버 는 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
client1
client2
또는 기타client
에 메 시 지 를 보 내 고 다른client
에 보 낸 메 시 지 를 받 을 수 있 습 니 다.리 트 윗 서버 에서 Redis 가 마 운 트 한 모든 링크 를 지 웁 니 다.Redis
client
에 게 메 시 지 를 보 냅 니 다.3.이 컴퓨터 에 연결 되 어 있 지 않 으 면 메 시 지 를 리 트 윗 서버 에 보 내 고 리 트 윗 서버 에서 이 메 시 지 를 연결 되 어 있 는 메시지 서버 에 보 내 고 메시지 서버 가 메 시 지 를 받 아 전달 합 니 다key
.4.메시지 발송 종료.인 코딩 구현
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 로 변경 되 었 습 니 다. $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 는 이 보 를 사용 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
tcp 서버 만들기/** * Created by PhpStorm. * User: Administrator * Date: 2018/4/3 * Time: 16:00 */ //创建服务器 TCP服务器 $serv = new swoole_ser...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.