消息服务器websocket高并发分布式swoole 架构思路

消息服务器websocket高并发分布式swoole 架构思路,第1张

消息服务器使用socket,为避免服务器过载,单台只允许500个socket连接,当一台不够的时候,扩充消息服务器是必然,问题来了,如何让链接在不同消息服务器上的用户可以实现消息发送呢?

要实现消息互通就必须要让这些消息服务器本身能互通,想了两个方式,一种是消息服务器之间交叉链接,另一种是增加一个特殊的消息服务器,这个消息服务器不对外开放,只负责消息转发和推送。

下列测试不考虑防火墙等。仅测试可行性和效率。

消息服务器

转发服务器

公共缓存

软件环境

client1 可向 client2 或者其他 client 发送消息,并接收其他 client 发送的消息.

Redis 中保存 client 连接的信息,给每个用户分配唯一的 key ,包括链接的哪台服务器,转发服务器定时检测消息服务器,如消息服务器挂掉,由转发服务器清理掉Redis已经挂掉的所有链接。

1. Client1 给 Client2 发送一条消息

2. Socket1 接收到消息,根据 key从Redis 取出 Client2 的连接信息,连接在本机,直接推送给 Client2 ,流程结束。

3.如果连接不在本机,把消息推送到转发服务器,由转发服务器把该消息推送给连接所在消息服务器,消息服务器接收消息,推送给 Client2 。

服务器上创建一个server.php,内容如下:

上只需把ip变更一下即可。192.168.0.201变更为192.168.0.202.

在转发服务器上建立脚本proxy.php,内容如下:

注意开启顺序

1.开启转发服务器php proxy.php

2.分别开启socket服务器php server.php

可以在转发服务器上看到两个消息服务器已经连接

3.开始测试,分别打开两个telnet,连接两个消息服务器,发送消息测试:

登陆

基于强大的 swoole 扩展,让php高效的实现这些成为可能,目前消息服务器到转发服务器是长连接,转发服务器到消息服务器是短连接,存在性能瓶颈,也浪费了连接资源。下一步改造成长连接,消息服务器的client使用异步。

首先,实现 Socket Service。

package com.jia.leozhengfirstapp

import java.io.IOException

import java.io.InputStream

import java.io.UnsupportedEncodingException

import java.net.ServerSocket

import java.net.Socket

import android.app.Service

import android.content.BroadcastReceiver

import android.content.Context

import android.content.Intent

import android.content.IntentFilter

import android.os.IBinder

import android.util.Log

public class SocketService extends Service {

private Socket clientSocket = null

private ServerSocket mServerSocket = null

private SocketAcceptThread socketAcceptThread = null

private SocketReceiveThread socketReceiveThread = null

private SocketReceiver socketReceiver

public static final String SOCKER_ACTION = "com.jia.Socket.Control"

public static final String SOCKER_RCV = "com.jia.Socket.ReceiveStr"

private boolean stop = true

@Override

public IBinder onBind(Intent intent) {

// TODO Auto-generated method stub

return null

}

@Override

public void onCreate() {

super.onCreate()

Log.d("service", "socket service created")

socketReceiver = new SocketReceiver()

IntentFilter filter = new IntentFilter()

filter.addAction(SOCKER_ACTION)

registerReceiver(socketReceiver, filter)

socketAcceptThread www.hbbz08.com = new SocketAcceptThread()

// 开启 Socket 监听线程

socketAcceptThread.start()

}

@Override

public void onStart(Intent intent, int startId) {

Log.d("service", "socket service start")

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/280838.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-21
下一篇2023-04-21

发表评论

登录后才能评论

评论列表(0条)

    保存