博客
关于我
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/

    你可能感兴趣的文章
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No qualifying bean of type ‘com.netflix.discovery.AbstractDiscoveryClientOptionalArgs<?>‘ available
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    no session found for current thread
    查看>>
    No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
    查看>>
    NO.23 ZenTaoPHP目录结构
    查看>>
    no1
    查看>>
    NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
    查看>>
    NOAA(美国海洋和大气管理局)气象数据获取与POI点数据获取
    查看>>
    NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
    查看>>
    node exporter完整版
    查看>>
    Node JS: < 一> 初识Node JS
    查看>>
    Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime(72)
    查看>>
    Node 裁切图片的方法
    查看>>
    Node+Express连接mysql实现增删改查
    查看>>
    node, nvm, npm,pnpm,以前简单的前端环境为什么越来越复杂
    查看>>
    Node-RED中Button按钮组件和TextInput文字输入组件的使用
    查看>>
    Node-RED中Switch开关和Dropdown选择组件的使用
    查看>>