상세 설계 및 인스턴트 메시징의 구현 (PHP + GatewayWorker + 레디 스)
우리는 기능을 구현해야
- 한 채팅 (귓속말)
- 채팅 일대 (그룹 채팅)
- 마찬가지로 QQ, 미세 문자 등 실시간 채팅 메시지 목록
공구 선택
-
GatewayWorker는 다음과 같은 특징을 가지고 있습니다 (더 많은 네트워크 시험관 설명서를 참조하십시오)
- 기반 Workerman 개발
- 기반 게이트웨이, 작업자 프로세스 모델
- 분산 배치를위한 지원
- 높은 동시성을 지원
- 모든 클라이언트에 글로벌 브로드 캐스트 또는 푸시 데이터를 지원
- 응용 프로그램 계층의 다양한 프로토콜 지원
- 멀티 프로토콜 지원
- 객체 또는 자원은 영구적 인 지원을 유지하기 위해
- 고성능
- 다른 프로젝트와 쉽게 통합
- 긴 연결을 지원
우리는 주로이 프로토콜을 WebSocket을 사용하고,이 프레임 워크는 GatewayWorker가 독립적으로 배포 할 수 있습니다 ThinkPHP, laravel와 다른 프레임 워크와 함께 사용하는 관련 비즈니스 로직에 대한 책임을 매우 편리 PHP입니다
- 키 조작, 설정 목록을 레디 스.
인스턴트 메시징, 가장 중요한 응답 속도, 우리는 "메시지 목록"그래서 다음 읽지 않은 메시지, 읽지 않은 수, 마지막 메시지 내용, 시간 등이있을 것를 표시해야합니다.
웹 소켓 및 GatewayWorker 원리는 더 이상 사용 서사는, 어린이 신발, 어머니의 정도를 이해하지 마십시오 것
결과는 보여
그룹 채팅 | 속삭임 렌더링
메시지 목록의 렌더링
데이터베이스 설계 (그룹 채팅, 별도로 개인 채팅)
위스퍼 디자인 (디자인 적요)
매개 변수 이름 | 설명 |
---|---|
신분증 | 기본 키 |
SENDER_ID | 보낸 사람 ID |
receive_id | 수신기 ID |
chat_identify | 확인 : 대화와 B, B와 대화를. 기록 AB |
MESSAGE_DETAILS | 메시지 내용 |
last_time_at | 채팅 기록 간격이 소정 시간을 초과 |
- 위해서는이 분야에서 chat_identify 필드의 사용은 더 쉽게 A, B 사이의 채팅을 찾을 수 있습니다.
- last_time_at QQ, 상기 마이크로 채널 사이의 채팅은, 시간 간격 당 하나의 채팅하지 표시 시각, 기록 될
그룹 채팅 (디자인 적요)
- 그리고 속삭임 좋아하지만, 수신기 ID는, GROUP_ID 그룹 ID가됩니다.
메시지 목록 디자인은, "개인 채팅, 그룹 채팅의"의 효과를 볼 것으로 예상하고 그래서 목록 표시, 그리고 데이터 변경이 실시간으로 발생합니다. 레디 스 여기
각 사용자 목록은 키 = message_list의 모음입니다 : USER_ID
Redis集合存储 消息类型 1私信,2群聊
message_list:user_id{
json_encode(['消息类型','接收者id|群组id']),
json_encode(['消息类型','接收者id|群组id']),
json_encode(['消息类型','接收者id|群组id']),
}
查找每个人的消息列表,直接取出该列表即可,但每个成员 都要对应 ‘未读消息数量’,‘最后一条消息内容’,‘最后一条小时时间’。由于是可变的,所以需要单独存储
Redis 键值 key = message_content:user_id_消息类型_id
key =>json_encode(['消息数量','最后一条消息内容','时间'])
上面 集合列表里的每一个成员都 对应这里的每个键值。
- 뉴스는 모든 작업 레디 스, 적절한 업데이트를 업데이트합니다.
- 이 속도는 의심의 여지가 없다 매우 빠르게 레디 스.
지역의 요구의 후속 최적화
-
기록 테이블 채팅 그룹 | 속삭임. 현재의 디자인은 하나의 양식 라이브러리입니다. 물론, 사용자의 증가, 피할 수없는 파열과 함께. 쿼리의 응답 속도에 영향을 미칩니다.
- (해결 아무것도 이상 : 서브 라이브러리 하위 테이블, 전송 백업 기록)
- GatewayWorker 통신 프레임 워크는 높은 동시성을 지원하지 수, 단일 서버 배포입니다.