长连接优化
实现即时通讯(IM)系统时,长连接是一种常见的技术选择,因为它可以提供低延迟的消息传递。然而,长连接也会带来一些挑战,特别是在需要处理大量并发用户和消息时。以下是一些优化点:
- 连接保持
- 超时处理:与服务端的通讯采用一问一答,增加超时逻辑来判断是否发送成功
- 心跳包:检测长连接是否正常可响应
- 重连退避机制:合理策略重连
- 接收消息优化
- 消息合并与缓冲
- 流量优化
- 持久化存储:通过本地数据库做持久化
- 减少连接数:过多长连接会浪费服务端资源
栈内存保护
-fstack-protector 是 GCC 和 Clang 编译器的一个选项,用于启用栈保护。这个选项可以帮助检测和防止栈溢出攻击。-fstack-protector-all 是这个选项的一个更严格的变体,它为所有函数添加了栈保护机制。-fstack-protector-all 可能会对程序的性能产生一定的影响,因为它增加了每个函数的额外开销。
当编译器开启了栈保护,它会在每个函数的栈帧中插入一个被称为“保护哨兵”(canary)的值。这个值在函数执行前被设置,并在函数返回前被检查。__stack_chk_guard 就是用来存储这个保护哨兵的随机值的。如果保护哨兵的值被修改,___stack_chk_fail 函数会被调用。默认情况下,___stack_chk_fail 会引发一个信号(如 SIGABRT),导致程序终止。
移动端跨端技术方案
移动端跨端方案的优点:代码复用,快速迭代,易于维护,广泛的开发社区,缩短上市时间。 移动端跨端方案的缺点:性能问题,平台特性限制,依赖跨端框架,多平台调试增加复杂性和难度。 主流的移动端跨端方案如下:
- 基于Web技术的跨端方案:小程序、Ionic、Apache Cordova等
- 基于JavaScript的跨端方案(直接使用原生组件,不使用Web视图):React Native、NativeScript
- 预编译为原生的跨端方案:Flutter
- 基于.NET的跨端方案:Xamarin 常见的跨端框架如下:Flutter、React Native、Ionic、Uniapp、NativeScript、Kotlin Multiplatform、Xamarin、Apache Cordova
dispatch_suspend & dispatch_resume
dispatch_suspend 是 GCD 多线程编程框架中的一个功能,用于暂停一个或多个 dispatch object(如 dispatch queue 或 dispatch source)。当一个 dispatch object 被挂起时,它将不会执行任何提交给它的任务,直到它被重新激活。
以下是 dispatch_suspend 的基本用法:
// 挂起队列
dispatch_suspend(queue);
// 恢复队列
dispatch_resume(queue);
// 暂停定时器
dispatch_suspend(timer);
// 开启、继续已暂停的定时器
dispatch_resume(timer);