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

    你可能感兴趣的文章
    Python轻松实现统计学中重要的相关性分析
    查看>>
    Python scrapy 常见问题及解决 【遇到的坑】
    查看>>
    Python Seborn热图数据的动态更新
    查看>>
    Python Seborn绘制空白直方图
    查看>>
    Python Selenium - 获取href值
    查看>>
    Python Selenium实现自动化测试及Chrome驱动使用!
    查看>>
    Python Selenium搭建UI自动化测试框架
    查看>>
    Python Selenium模块详解
    查看>>
    Python selenium爬取影评生成词云图
    查看>>
    python selenium自动化测试报告
    查看>>
    Python selenium自动化测试框架实战 —— 登录测试案例
    查看>>
    Python Selenium设计模式 —— POM
    查看>>
    Python Serial:如何使用 read 或 readline 函数一次读取多个字符
    查看>>
    Python set([]) 如何检查两个对象是否相等?一个对象需要定义哪些方法来自定义它?
    查看>>
    Python setup.py:数据文件无法复制目录:不存在或不是常规文件
    查看>>
    Python setuptools sdist:仅安装版本化文件
    查看>>
    Python Shell下使用matplotlib
    查看>>
    Python Slice How-to,我知道Python Slice,但我怎么才能使用内置的Slice对象呢?
    查看>>
    python socket分包发送数据
    查看>>
    python socket模块_Python socket模块实现TCP服务端客户端
    查看>>