在过去的一年里,数万新用户选择了 LeanCloud,开发者在我们的平台上创建了数万新应用。尽管在 6 月遇到了一些因外部因素带来的困难,2019 年仍然是 LeanCloud 实现整体盈利的第一年。这离不开用户的长期支持,同时健康的财务对于为用户提供持续、稳定、不断改进的服务也是至关重要的。
在过去一年里我们正式推出了 LeanCloud 国际版,全面支持域名绑定,并为对稳定性、可控性、灵活性有更高要求的用户开发了全新的独立部署方案。多人对战 Client Engine 正式上线,同时为规模较大的游戏提供了独立部署选项。云引擎新增了云队列和 MySQL 支持。其他服务和 SDK 也有大量改进和优化。
国际版正式运行
为了适应用户的需求变化以及产品下一步的发展,让 LeanCloud 正式成为国际化的产品,我们推出了 LeanCloud 国际版。国际版使用独立的顶级域名 leancloud.app 和账户体系,由 LeanCloud 的境外公司作为主体运营,费用使用美元结算。我们已经初步完成了网站、控制台、文档的国际化,也提供英语技术支持,让英文环境的开发者也可以使用 LeanCloud。
全面支持域名绑定
为了确保能长期稳定为开发者提供服务,按照相关法律法规和有关部门的要求,我们推动了使用 LeanCloud 服务的应用绑定自有域名。绑定自有域名也有利于从域名层面做好应用隔离,确保业务稳定。为了保证安全性,API 域名必须启用 SSL(云引擎域名、文件域名推荐启用 SSL),我们也推出了自动管理功能,支持 SSL 证书的自动申请和自动续期。
存储服务
全新独立部署方案
为了满足众多企业客户对平台稳定性、后端可控性以及功能多样性方面的要求,我们推出了新的独立部署方案,希望减少使用中的限制,给开发者更大的灵活性,同时也提供一个更加稳定可靠的完整后端,满足业务系统的更高要求。
新的独立部署方案里,我们会使用「独立的存储集群 + 独立的 API 集群 + 独立的扩展服务集群」的模式来构建一个完整的、物理隔离的公有云系统,供单个用户和应用独享使用。
这里的「扩展服务」是指基于存储到云端的结构化数据,解决特定业务需求的垂直服务,例如并行计算(原离线分析功能)、全文检索(原应用内搜索功能)等。
新的 API Server 是完全重新开发的,我们针对单应用独立部署的使用场景进行了功能裁剪和架构优化,取消了共享集群方式下的一些请求限制(例如数据导入导出、并发线程上限等),增加了更多数据处理接口(例如提供了索引操作和聚合查询的 REST API),同时还有更好的并发处理性能和弹性伸缩能力。
云引擎
云队列
我们推出了云队列服务。云队列提供了一种在云引擎之外调度云函数的能力,它基于云引擎已有的「云函数」这个概念实现了重试、去重、结果查询、延时任务、定时任务等功能,是对云函数功能的一个补充。
尚未运行的任务会以一种可靠的方式暂存在云队列,即使你的云引擎因部署、过载、崩溃而重启,任务也不会丢失,云队列会等待你的云引擎实例恢复正常后继续运行它们。我们也基于云队列重新实现了定时任务,它兼容之前的绝大部分用法,并支持以 JSON 形式向云函数传递自定义的参数,以及配置在超时情况下的行为(重试或放弃)。对了,我们还移除了定时任务的个数限制。
MySQL
我们在华北节点推出了高可用、高性价比的 MySQL 数据库托管方案。开发者可以在云引擎中使用通用的 MySQL 客户端类库,访问完整的 MySQL 功能。
其他
云引擎统计结果展示也进行了优化,现在开发者可以在控制台按照总览、网站托管请求以及单个云函数来分别查看请求数(按分钟聚合)和响应时间的变化趋势,还可以看到整体的 CPU、内存以及流量消耗,希望在程序运行状况和代码优化上给大家提供更多参考信息。
云引擎命令行工具也发布了 0.21.0 版,修复了一些 bug,也支持指定 --prod
参数直接部署到生产环境,以及本地调试静态网站项目。
云引擎 Java 环境支持指定 Java 版本,开发者可以选用 Java 8、11、12、13、14 来开发项目。
云引擎 Node.js 环境新增了 internal
选项,用来禁止在客户端调用云函数。我们还推出了一个常用功能和示例汇总代码仓库,其中包括推荐的最佳实践和常用的代码片段,每个文件中都有较为详细的注释,适合云引擎的开发者阅读、参考,也可以将代码片段复制到你的项目中使用。
推送和即时通讯
Android 混合推送现已支持 vivo、oppo、小米推送国际版,可以覆盖更多终端用户。
我们还对即时通讯和推送服务做了一些其他改进和优化,以便为开发者提供更稳定的服务、更灵活的功能:
- 即时通讯新增了客户端上下线 hook 支持,在客户端登录成功、登出成功、意外下线后调用。
- 通过 SDK 新建对话默认启用
unique
参数,更贴合大多数应用的使用场景。
- 通过 REST API 发送消息现在也支持提醒用户(
mention_all
和 mention_client_ids
参数)了。
- 即时通讯的离线推送记录现在也加入到推送历史记录里面,可以在控制台一并查看。
- 推送服务现在支持直接指定设备 ID 进行推送,比通过查询条件推送更快,延迟更低。
- 开发者现在能对推送时间和推送速度(
flow_control
参数)进行更精细的控制。
游戏解决方案
为了更好服务较大规模的游戏开发者,我们推出了多人对战 GameServer 的独立部署版本。独立部署的后端服务节点(集群),让业务完全独享所有的物理资源,以便给开发者带来更好的稳定性和灵活度。相比于共享集群模式,独立部署的 GameServer 有如下优势:
- 支持通过 hook 函数 的方式来编写服务端逻辑,业务扩展代码与 GameServer 在同一个进程内运行,与 Client Engine 方式相比在实时性上有显著提升。
- 取消了部分使用限制,例如房间最大人数、最大消息下发频率、消息体大小限制等,在硬件能力许可范围内尽可能满足业务需求。
- 对资源独占使用,支持自动扩容。
此外,游戏解决方案迎来了以下改进:
- Client Engine 在完善底层架构、使用框架、文档之后,发布了正式版。
- 排行榜增强了防作弊的策略,只放行可信环境的数据更新请求,避免被恶意刷榜。
- 优化了游戏 SDK,简化了进入游戏大厅的逻辑,并且将消息序列化协议全部切换到 Protocol Buffers,进一步降低客户端的网络流量和传输延时。
控制台和官网
我们对控制台进行了改版,目前存储服务部分已经完成并上线。新版本的控制台,我们将存储相关的功能(如 LiveQuery、离线分析和应用内搜索)合并到了一起,对普通的结构化数据存储、文件、用户系统进行了拆分,并且将数据展示与权限设置、索引和性能优化等内容集中起来,希望控制台逻辑更清晰,可以给开发者带来便利。上文提到的云引擎统计结果展示界面的改进,就是基于新版控制台重新实现的。
此外,控制台新增了激活归档应用和注销账号功能,个人实名认证也切换到了基于支付宝客户端的方案。
我们也重新设计了官网的价格页面,更加清晰、全面地展示各项服务的价格方案。
SDK
2019 年各 SDK 也发布了不少新版本,除了跟进上文提到的各服务的新功能外,主要还有以下改进:
Java
新推出的统一的 Java SDK 正式取代旧版的 Java SDK 和 Android SDK。新版的 SDK 全面采用了 Reactive 编程风格,同时也兼容老的 Callback 方式。在 Android 平台上,新版 SDK 切换到了 AndroidX。
对于开发者担心的 Android 应用在客户端暴露 appKey 可能带来的潜在风险,我们现在允许应用程序只通过 appId 来完成 LeanCloud 服务初始化,从而避免了暴露应用核心配置信息的风险。
有些只使用推送服务的客户希望优化产品移动端体验,我们为此专门推出了精简版推送 SDK,显著优化了安装包大小(1.2 MB -> 180 KB)和启动时间(59 ms -> 5 ms)。
Swift & Objective C
Swift SDK 增加了对即时通讯、推送、云函数调用的支持,并完善了结构化存储方面的功能,在功能上基本对齐了 Android、Web 平台的 SDK。有许多 iOS 平台的开发者已经从 Objective C SDK 迁移到 Swift SDK, 还有一些新应用直接基于 Swift SDK 开发。
Swift 语言的演进十分迅捷(swift),Swift SDK 同样如此,现已支持 Swift 5 和 Swift Package Manager。
Objective C SDK 也增加了一些功能,修复了许多 bug。
另外,为了精简代码和集中资源,Swift SDK 不再支持 iOS 10 之前的系统,Objective C SDK 不再支持 iOS 8 之前的系统。
JavaScript
JavaScript SDK 的主要改进有:
- 小程序用户系统增加了 UnionId 支持。
- 增加了手动启用、停用调试模式的开关:
debug.enable()
和 debug.disable()
。
-
AV.File#save
方法增加了 keepFileName
参数允许保留文件的文件名。
- 增加了
AV.Object#revert
方法撤销部分或全部修改了但未保存(save)的改动。
-
MESSAGE_UPDATE
与 MESSAGE_RECALL
事件现在会额外返回一个 reason 参数来指示修改、撤回的原因(如果有的话)。
- 修复和完善了大量 TypeScript 定义。
C Sharp
C# SDK 的主要改进有:
- 简化、统一 portable 和 Unity 初始化方式,现在只需要在代码中初始化,不需要在 Unity Editor 拖拽和设置。
- 增加消息撤回/修改功能。
结语
在这一年里,许多用户通过工单、论坛、邮件等各种渠道向我们反馈问题和意见,也有用户向我们开源的 SDK 提交代码。上面提到的很多新功能、改进、优化都源于用户的反馈。感谢大家的帮助和信赖,我们期待在新的一年里为用户提供更好的产品和服务。