基于mediasoup实现类似RTMP-CDN的回源机制,从而实现cluster-node的横向扩容。
mediasoup worker实现了PipeTransport机制。
pipeTransport代表了一个RTP通信对,可以实现同一台机器或者多台机器之间的通信。
A pipe transport represents a network path through which RTP, RTCP (optionally secured with SRTP) and SCTP (DataChannel) is transmitted.
Pipe transports are intented to intercommunicate two Router instances collocated on the same host or on separate hosts.
基于这个机制,可以实现从源节点pipe video到多个不同edge节点的功能。
源节点作为socket server工作,等候edgeNode连接请求。
function OriginSvrListener (ioSvr) {
ioSvr.on('connection', (socket) => {
socket.routerIds = new Map()
viewerEndpoints.set(socket.id, socket)
roomList.forEach(async (room) => {
const roomId = room.id
//向edgenode请求用作pipe的routerId。
const { remoteRouterId } = await socket.emit('getRemoteRouterInfo', { roomId })
//建立本地room与多个edgenode的映射表
socket.routerIds.set(roomId, remoteRouterId)
//获得本地producers,然后pipe to remote router.
const producers = room.getProducers()
producers.forEach(({ producer, router }) => {
room.pipeToRemoteRouter({ router, remoteRouterId, roomId, producer, socket })
})
})
})
}
边缘节点作为socket client工作。
async function edgeSocketClient (params = { channelName: undefined, arrBroadcasterAddr: [] }) {
let broadcasterAddr = arrBroadcasterAddr[0] + config.NAMESPACE
const edgeSocket = ioClient.connect(broadcasterAddr, { transpor