2017-10-03 9 views
2

socketio 설정에 This을 사용하고 있습니다. 2 개의 다른 socketio 서버 (서버 1과 서버 2)가 클러스터로 실행 중일 때 RedissonStoreFactorynetty-socketio 서버 클러스터 만들기

내 문제는 클라이언트가 server1과 연결하면 server2는 연결된 클라이언트 인 경우 정보가 없음을 의미합니다. 예. 2 클라이언트가 server1에 연결하는 경우 server2에서 server.getAllClients()을 실행하면 2 카운트의 목록 대신 빈 목록이 반환됩니다.

여기 내 코드는 2 개의 다른 컴퓨터에서 실행됩니다.

@SpringBootApplication 
public class Application { 


    private static final Logger LOGGER = Logger.getLogger(Application.class); 

    @Value("${test.socketio.hostName}") 
    private String socketIOHostName; 

    @Value("${test.socketio.port}") 
    private Integer socketIOport; 

    @Value("${test.dedisson.redissonAddress}") 
    private String redissonAddress; 

    @Autowired 
    private RedissonClient redissonClient; 

    @Bean 
    public SocketIOServer socketIOServer() { 
     LOGGER.info("Socket server starting on host=" + socketIOHostName + ", port=" + socketIOport); 
     Configuration config = new Configuration(); 
     config.setHostname(socketIOHostName); 
     config.setPort(socketIOport); 

     StoreFactory redissonStoreFactory = new RedissonStoreFactory(redissonClient); 
     config.setStoreFactory(redissonStoreFactory); 
     SocketIOServer server = new SocketIOServer(config); 
     server.start(); 
     LOGGER.info("Socket server started"); 
     return server; 
    } 

    /** 
    * 
    * @return 
    */ 
    @Bean 
    public RedissonClient getRedissonClient(){ 
     LOGGER.info("creatting redisson client on redissonAddress="+redissonAddress); 
     Config config = new Config(); 
     config.useSingleServer().setAddress(redissonAddress); 
     RedissonClient redisson = Redisson.create(config); 
     LOGGER.info("redisson client connected"); 
     return redisson; 
    } 


    public Application() { 
     //Nothing to be done here 
    } 

    public static void main(String[] args) { 
     ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public SpringAnnotationScanner springAnnotationScanner(SocketIOServer ssrv) { 
     return new SpringAnnotationScanner(ssrv); 
    } 
} 

나는 장애 조치 condition.If 서버 1 2 개 인스턴스를 선호는 서버 2가 연결된 클라이언트에 통지를 보내드립니다 아래이지만, 내 경우에는, 서버 2는 서버 1로 연결된 클라이언트의 아무 생각이 없습니다.

답변

1

클라이언트가 server1에 연결하는 경우 server2에서 server.getAllClients()를 실행하면 2 카운트의 목록 대신 빈 목록이 반환됩니다.

이것은 예상됩니다. Server2는 sessionId (클래스 BaseStoreFactory의 모습) 등과 같이 server1과 연결된 클라이언트에 대한 정보를 가질 수 있지만 server2는 해당 클라이언트와 연결되어 있지 않으므로 server2와 연결된 클라이언트 간에는 채널이 없습니다. server1. 낮은 수준에서 TCP 소켓 연결이 없을 때 server2가 클라이언트와 어떻게 통신 할 수 있는지 생각해보십시오.

server1이 작동 중지되면 server2는 연결된 클라이언트에게 알림을 보내지 만 제 경우 server2는 연결된 클라이언트가 server1인지 전혀 모릅니다.

사용 (iphash와) Nginx에 또는 즉시 하나 개의 서버가 다운로 클러스터의 상단에있는 프록시는 클라이언트가 다시 연결을 시도하고 nginx를 다른 서버로 리디렉션합니다. 임상의 관점에서 볼 때, 그다지 지연되지는 않을 것입니다.