2013-07-08 130 views
1

在JBoss上運行的網絡應用程序,還有一個TCP套接字連接,我們用它來實現心跳會話(RTSP)。到現在爲止它是做一個客戶端套接字綁定: -插座切換在集羣環境中

Socket client = new Socket(host,port); 
PrintWriter out = new PrintWriter(sock.getOutputStream(), true); 
out.write(data); 
out.flush(); 

現在我們需要一個負載平衡器後面實現雙機熱備/集羣。

所以,問題是 - 當一個故障發生是千方百計保持心跳,無需重新連接?

[EDIT-details] Container - Jboss 7.1 RTSP - PayLoad採用RTSP格式。 [data = "GET_PARAMETER " + m.mediaURL + " RTSP/1.0" + "\r\n" + "CSeq: " + seqNumber + "\r\n" + "Session: " + m.sessionId + "\r\n" + "Content-Length: 0\r\nContent-Type: text/parameters\r\n" + "\r\n";]

+0

你可以添加更多的細節?這段代碼在哪裏運行?你在這個插座上做什麼? RTSP的作用是什麼? – Beryllium

+0

任何幫助的想法? – indranil32

回答

0

如果你想透明的TCP連接故障轉移

我不知道它支持透明故障轉移的TCP連接一個Java libary的。由於TCP是有狀態的,這並不容易。

甲引自Transparent TCP connection failover

本文介紹了一種系統,該系統使得能夠以這樣的方式即是透明的客戶端和服務器應用程序TCP服務器端點的故障轉移。故障轉移可以在連接生命週期的任何時候發生。故障轉移是通過修改服務器的TCP/IP堆棧來實現的。客戶端的TCP/IP堆棧,客戶端應用程序或服務器應用程序不需要任何修改。該系統支持服務器的主動或半主動複製

由於RTSP沒有綁定到TCP,我會考慮使用UDP。

如果心臟跳動是不實際的協議

的一部分,但也有一些其他的可能性

  1. 使用UDP心臟的跳動協議
  2. 始終打開/關閉TCP連接
  3. 寫你自己的TCP其確實在write方法引擎蓋下重新連接實現。因此,您可能需要某種協議中的ping請求,只是爲了能夠檢查連接。
  4. 在現有實現中使用aspectj來包裝write:因此,您可以添加一個before塊來檢查連接,並在真正進入write之前進行重新連接。這可能很複雜,因爲涉及java.*javax.*

如果它要快,我會選擇UDP。

如果你聽到的拍頻並不高,你總是可以打開/關閉你的TCP連接。

如果你對系統足夠/完全控制,但你需要保持一個「開放式」連接的概念,你可以使用選項3,模擬天生一個「開放」的連接。

如果涉及不受您控制的其他系統,請使用aspectj。這是一個破解,因爲你不能輕易編織java.*javax.*

+0

1.我要與之通話的接口是TCP,不能更改爲UDP。你提到的頻率不到一分鐘。 3.我也有興趣知道誰的表現更好a)打開1個客戶端套接字並將其用於多個事務或爲每個事務打開單獨的套接字 – indranil32

+0

究竟是什麼頻率:1s或5s?如果是10秒,打開/關閉應該沒問題。開放的套接字應該更快,但問題是:打開/關閉快*足夠*?我只是試試它。 – Beryllium

+0

在不到一分鐘的時間內,我必須執行「GET_PARAMETER」或「PING」才能保持會話正常運行。關於Socket操作,我們希望支持4000個併發事務[SETUP&PLAY,PLAY,PAUSE,GET_PARAMETER] – indranil32