博客
关于我
HelloTalk 基于 OpenResty 的全球化探索之路
阅读量:461 次
发布时间:2019-03-06

本文共 1578 字,大约阅读时间需要 5 分钟。

HelloTalk 基于 OpenResty 的全球化探索之路

我是 HelloTalk 的后端技术负责人李凌,今天将分享我们在 OpenResty 和 Apache APISIX 上的实践经验。

HelloTalk 是一个全球最大的外语学习社交社区,拥有 1600 万用户。我们致力于为用户提供跨文化交流和学习的平台,支持 150 多种外语的语音改写、翻译和学习功能。用户主要分布在中国、日本、韩国、美、欧、巴西等地,海外用户占比 80%。在技术实现上,我们将系统架构与 OpenResty 结合,解决了全球化部署中的诸多挑战。

技术选择与协议设计

早期,我们使用 C++ 开发 IM 服务,协议设计为 TLV+PB模式,目标是实现轻量级的高效通信。然而,这种方式在外部接口暴露时需要自行开发 Proxy Server,导致协议适配成本较高。为了降低成本和提升效率,我们于 2015 年开始引入 OpenResty。

OpenResty 提供了两大核心优势:一是通过前置代理,将内部协议转换为 HTTP 协议,简化了外部接口的开发和维护;二是集成 WAF 功能,防止 PHP 业务中的注入攻击。我们通过 OpenResty 实现了协议转换和安全防护,显著降低了运维成本。

在协议解析方面,OpenResty 配合 Lua-protobuf 库,能够将 Protobuf 格式的数据直接转换为 JSON 格式,大大简化了数据处理逻辑。我们还开发了基于 cosocket 的 TCP 协议安全解析模块,确保数据包的完整性和正确性。

国际化部署中的挑战与解决方案

HelloTalk 的用户分布极为分散,海外用户占比 80%,因此我们需要解决以下挑战:

  • 用户区域分散:海外用户遍布全球,网络环境和语言差异较大。
  • 防火墙限制:国内用户的防火墙政策限制了外部接入。
  • 语言适配问题:不同地区的语言环境和网络条件差异显著。
  • 针对这些挑战,我们采取以下措施:

  • 多云环境部署:结合阿里云的全球加速服务和多线路负载均衡,确保用户接入的稳定性和可靠性。
  • 网络优化方案:通过 OpenResty 实现动态上游检测和切换,确保网络延迟最低。
  • 协议适配优化:基于 HTTP/2 和 WebSocket协议,支持长连接和短连接混合模式,提升消息传递效率。
  • 接入节点与质量管理

    我们在美国东部、法兰克福、新加坡、东京、香港等地部署接入节点,通过 failover 机制和智能检测,确保多线路切换的平滑性。对于特殊地区(如巴西),我们选择 AWS 和本地云服务的混合部署,确保服务的稳定性和可靠性。

    在网络质量管理方面,我们引入了以下策略:

  • 线路控制:动态调整上游服务商,确保接入路径最优。
  • 流量管理:基于 OpenResty 的限流功能,防止消息频率过高等问题。
  • 节点质量监控:通过实时监控和智能算法,评估各节点的服务质量,实现流量智能分配。
  • Apache APISIX 的引入与应用

    在使用 OpenResty 的基础上,我们逐步引入 Apache APISIX 作为 API Gateway,主要原因如下:

  • 动态化配置:通过 ETCD 存储配置数据,实现动态更新和版本管理。
  • 代码简洁性:APISIX 的代码逻辑极为简洁,便于快速定制和维护。
  • 高性能和可扩展性:基于 Lua 引擎,支持复杂逻辑的快速执行,性能表现优于自建 Gateway。
  • 通过 Apache APISIX,我们能够更高效地管理 API 接口,实现伪装动态化和服务治理,显著提升了系统的灵活性和可维护性。

    结语

    HelloTalk 的全球化之路并非一帆风顺,但通过 OpenResty 和 Apache APISIX 的技术支持,我们成功解决了诸多技术难题。如果你对我们的实践感兴趣,欢迎在技术交流社区中深入探讨!

    转载地址:http://rerfz.baihongyu.com/

    你可能感兴趣的文章
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    Numpy.ndarray对象不可调用
    查看>>
    numpy判断对应位置是否相等,all、any的使用
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    NVelocity标签使用详解
    查看>>
    nvidia-htop 使用教程
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>