基于IP地址是最简单的,只要建立两个WAN,然后在路由表添加条目,把特定IP或网段转发到特定的WAN即可。但是这不稳定,需要经常维护,因为服务的IP会自动变(不过可以结合智能DNS来使用,比如特定域名解析出的IP自动添加到路由表实现分流)。而且像百度网盘这样的应用,上传和下载服务器可能都是在一起的,根据IP没办法分开。
代理服务器方案复杂一点,但根据域名或请求类型进行分流还算稳定,配好了就能一直用,并且可以完美的处理HTTP类型流量。不过想让代理服务器完美处理HTTPS流量比较困难,如果想避免证书信任问题,就只能透明转发,这样就只能提取到域名,提取不到HTTP请求类型了。如果想接管HTTPS流量,根据请求类型进行分流,就会遇到证书不信任的问题。此外,代理服务器也完全没有处理UDP等游戏流量的能力。
此外,某些应用的登录状态是和IP绑定在一起的,切换线路会导致掉线或者访问被拒绝,服务无法正常使用,这样分流也就失去了意义。
综上所述,按应用进行分流是可行的,但根据上传下载进行分流比较困难,对登录状态绑定IP的应用来说甚至不可行。
简单来说,在路由器看来,最初建立的所有连接都是上传连接,如果不手写规则,路由器没办法自动发现它是下载连接。等路由器发现它是下载连接的时候,连接已经确立,失去了切换线路的机会。
在路由器的视角中,上传连接和下载连接唯一的区别只是上传连接中,你发送的数据包比收到的数据包多,而下载连接恰好相反。但这个信息只有连接建立后才能知道,而一但连接建立,就没办法切换线路了。
所以必须有人手写规则,在建立连接之前根据其他信息(比如域名、IP地址或HTTP请求类型)猜测该连接到底是上传还是下载,然后才能进行分流。如果要分析HTTP请求类型,就需要使用代理服务器,然后在代理服务器里添加规则,并借助iptables把流量转发到代理服务器进行分析。基于域名和IP地址的话可以使用路由规则(ip route或ip rule)实现。
@烟雨,只能根据域名或者IP地址进行分流,比如百度网盘走线路A,腾讯视频走线路B。
上传下载自动分离是做不到的,因为任何连接在最开始的时候都是上传(是你连接服务器,此时你是上传方),随后服务器开始发送大量数据,才变成下载,但此时连接已经建立,没办法切换到另一条线路了。
所以必须手动创建规则,在连接还没有建立的时候就决定要走哪条线路。
LevelDB
@c,本来就不应该做这种改变。如果可能会改变又没加锁,就是bug。
@㝶芾厶眵攴䭡,我其实不知道是新特性,只是做理论分析。
@㝶芾厶眵攴䭡,如果编译时已经优化成寄存器拷贝了,就不会有内存分配了。
如果对象很小,可以直接放在寄存器上(<=64位),用值接收者可以更快,因为可以优化为寄存器拷贝,避免了内存寻址。如果用指针接收者,就必须为对象分配内存地址,会稍慢。
@1mm0rtal,用这种方式发送一个启动sw3.exe的
wine.log文件:
https://hu60.cn/q.php/bbs.topic.96470.html#nav
package main import ( "fmt" ) type InterfaceConnection interface { DoSomething() int } type MyConnection struct { id int } func (c *MyConnection) DoSomething() int { fmt.Println("Doing something:", c.id) return c.id } func main() { Connections := make(map[uint64]InterfaceConnection) _workerConnections := make(map[uint64]InterfaceConnection) conn := &MyConnection{id: 1} Connections[1] = conn _workerConnections[1] = conn obj, ok := Connections[1] fmt.Printf("%v, %v\n", obj, ok) delete(Connections, 1) obj, ok = Connections[1] fmt.Printf("%v, %v\n", obj, ok) obj, ok = _workerConnections[1] fmt.Printf("%v, %v\n", obj, ok) }&{1}, true <nil>, false &{1}, true确实不会影响另一个
map的value是同一个&Struct{}
map的delete只是删除了键和值的对应关系,并不会对值做内存释放操作。
除非没有地方继续引用该值,它才会被垃圾回收。
所以直到fmt.Printf("%p", _workerConnections[1])执行完成,&MyConnection{id: 1}才可以被垃圾回收,在此之前它都是有效的。
@1mm0rtal,你选的游戏安装程序是什么格式,是exe吗?
@bigfuji,麒麟990只能使用华为定制的内核,安装第三方内核没有用,就算真的换了应该也启动不了。
@无名啊,可以负载均衡啊,一个直播间对应一个弹幕服务器就行了。
减少弹幕数量和屏蔽的功能都可以在前端实现,字幕轨只是用于提取弹幕内容。
顺便一提直播弹幕,我觉得最有趣的方法是直接把弹幕嵌在视频流的字幕轨里,这样只要前端加个字幕轨提取代码就行了。视频编码器那边,加字幕的工作交给切片服务器就行了,切片是很简单的工作,顺便混合一下字幕不会有什么额外开销。唯一的问题是审核,想删掉嵌入视频的弹幕比较困难
@无名啊,直播间弹幕甚至可以像直播本身一样通过无状态HTTP服务器分发,按时间切片放在不同的json文件里,然后由一个列表(类似m3u8)不断列出最新的json文件名,由播放器自行下载展示。这样就能用分发直播视频流的渠道分发弹幕了。
