將多個客戶端連線(Client Connections)多工為單一後端連線(Backend Connection),使後端邏輯服務器無需處理併發,專注業務。類似數位電路的 Multiplexer(資料選擇器)。
每個 TcpConnection 內建 boost::any context_,可存放任意綁定資料(如 Connection ID、最後活躍時間、用戶名)。無需繼承 TcpConnection 即可擴展狀態:
void onClientConnection(const TcpConnectionPtr& conn)
{
if (conn->connected())
{
int id = allocateId();
conn->setContext(id); // 存入 ID
notifyBackendClientUp(id);
}
else
{
if (!conn->getContext().empty())
{
int id = boost::any_cast<int>(conn->getContext());
releaseId(id);
notifyBackendClientDown(id);
}
}
}
void onClientMessage(const TcpConnectionPtr& conn, Buffer* buf, Timestamp)
{
if (!conn->getContext().empty())
{
int id = boost::any_cast<int>(conn->getContext());
sendToBackend(id, buf);
}
else buf->retrieveAll();
}
TcpConnection 採用 boost::shared_ptr 管理,確保後端發送資料時對象仍存活。參考《當析構函數遇到多線程》一文。
首個具非平凡業務邏輯的示例,編寫 Java + Netty 實現的測試套件,扮演 Clients 與 Backend。結構: