保障高可用并不代表可以牺牲性能,对于一个用户使用最频繁的应用,反而更要对使用的资源精打细算。例如在 Mars 信令传输超时设计中,多级超时的设计充分的考虑了可用性与高性能之间的平衡取舍。
如果说高可用高性能只是客户端本身的考虑的话,负载均衡就需要结合服务器端来考虑了,做一个客户端网络永远不能只把眼光放在客户端上。任何有关网络访问的决策都要考虑给服务器所带来的额外压力是多大。为了选用质量较好的 IP,曾经写了完整的客户端测速代码,后来删掉,其中一个原因是因为不想给服务器带来额外的负担。Mars 的代码中,选择 IP 时用了大量的随机函数也是为了规避大量的用户同时访问同一台服务器而做的。
基础网络优化:常规的网络能力,例如 DNS 防劫持、动态 IP 下发、就近接入、容灾恢复等,在这一阶段得到逐步的建设与完善。除此之外,Mars 的网络模块是基于 socket 层的网络解决方案,在缺失大而全的 HTTP 能力的同时,却可以将优化做到更细致,细致到连接策略、连接超时、多级读写超时、收发策略等每个网络过程中。例如,当遇到弱网络下连通率较低,或者某些连通率不好的的服务器影响使用时,我们使用了复合连接(代码见complexconnect.cc)和 IP 排序(代码见simple_ipport_sort.cc)的方案很好的应对这两个问题。
#00 pc 0x43e50 /system/lib/libc.so (???)
#01 pc 0x3143 /system/vendor/lib/libvendorconn.so (handleDpmIpcReq+154)
#02 pc 0x2f6d /system/vendor/lib/libvendorconn.so (send_ipc_req+276)
#03 pc 0x30ff /system/vendor/lib/libcneconn.so (connect+438)