作者归档:Yiran

LeanCloud 国内域名已开始恢复

各位用户大家好,

在昨天向有关部门提交了一份更详细的报告后,今天阿里云通知我们已经接到有关部门通知,将对我们的域名解封。约 12 点 30 分时,经过我们的验证,域名在阿里云的注册系统中恢复正常状态。但是状态更新预计还需要一段时间才能传递到全球的 DNS 服务器。

在原域名恢复后,请各位用户仍按照我们之前的通知绑定自己的 API 域名、云引擎网站域名(如果使用了该功能)。

我们知道很多用户和 LeanCloud 一样因为这次事件蒙受了重大损失,需要对事情的始末有更详细了解。目前我们仍需要执行一些后续的防范措施,有一些信息还不宜披露。在这些措施完成后,在不违背相关法律法规、不传播违法或需保密信息的前提下,我们会向用户发布一份报告,说明我们所能了解到的所有事实。

关于 LeanCloud 国内域名问题的更新(6 月 24 日)

各位用户,大家好。我想继续向大家更新一下我们在解决域名问题方面的进展。

为了尽快恢复老域名,我们今天再次拜访了有关部门并提交了更多的证明材料,不过因为涉及多层政府部门,我们对于进展的影响有限,目前仍然无法给用户承诺老域名恢复的时间。我们建议用户尽快完成域名的切换,并尽快绑定自己的已备案域名。

在我们可控的范围内,我们在周末和今天完成了以下一些措施:

  • 修复了因为域名变更导致的论坛不可用的问题。(论坛域名为 https://forum.avoscloud.com,如果您访问时跳转到老域名,有可能需要清空浏览器缓存)。
  • 为了保证现有用户的利益,我们暂停了华北和华东节点的注册。需要新建账户的用户可以用 email 联系我们(support@leancloud.rocks) 并提供基本的企业信息。对于后端不是必须在国内的用户或非企业用户,可以使用国际版。
  • 修复了用户反馈的因切换域名出现的 bug。
  • 完善了关于切换替代域名绑定自定义 API 域名的文档。
  • 按照有关部门的规定,即使在原有域名恢复后,各应用仍需绑定自己的 API 域名。在一段时间之后,我们将无法向不绑定自有域名的应用服务。我们仍将保持原有域名和目前的替代域名长期有效以保持旧版本应用的兼容性。目前我们可以协助商用版用户完成新域名的备案,但由于人力所限开发版用户暂时只能绑定已经备案的域名。已经绑定过云引擎网站域名的用户需要注意,这和 API 域名是两个域名,所以您仍将需要绑定 API 域名。

我们在过去的几天里针对此次域名事件快速确定了对服务模式需要作出的改变以在未来消除类似的风险,我们在国内将更加专注于服务好商业用户,并确保各应用有很高的隔离性和抗风险性,不同用户之间不共用任何顶级域名,各应用也将不再依赖 LeanCloud 自有的域名。我们将在未来较短的时间里公布和实现这些措施。

再次感谢各位用户的耐心和支持。

LeanCloud 江宏

关于 LeanCloud 国内域名解析问题的情况更新

我们监测到从今天(06/20)下午开始各个地区陆续出现部分网络无法解析华北节点的 api.leancloud.cn 以及 *.lncld.net 域名的问题。通过和我们的域名注册商阿里云沟通,得知他们接到有关部门行政命令将一批域名设置为 ClientHold 状态,其中包括 leancloud.cn 和 lncld.net,但是没有可执行的其它信息可以提供给我们。目前我们仍在和阿里云沟通中。
这个问题目前影响到从公网使用 leancloud.cn、lncld.net 及其子域名的服务,包括:

  • 华北节点:从公网对存储及即时通讯服务的调用
  • 华东节点:即时通讯服务和部分使用老版本 SDK 访问存储服务的应用
  • 美国节点部分仍在使用 us-api.leancloud.cn 从公网调用存储服务的老应用
  • 美国节点的即时通讯服务(我们在做一些改动降低影响范围)

不受影响的服务有

  • 各节点:云引擎的公网访问及云引擎对存储、即时通讯服务 API 的访问
  • 对华东节点存储服务的访问
  • 美国节点的大部分应用(使用新域名的应用)对存储服务的访问

在争取尽快彻底解决问题的同时,我们也提供了让用户可以暂时切换的域名。如果您是从服务端,或者 JavaScript 代码调用 LeanCloud 的服务,可以按照这里的说明来切换到新域名。

感谢您的耐心和理解。我们会及时与用户沟通新的进展。

域名无法访问的临时解决方案

我们监测到从今天(06/20)下午开始各个地区陆续出现部分网络无法解析 leancloud.cn 以及 ***.***.lncld.net 域名的问题。我们正在全力和域名提供商沟通该问题的解决方案。在问题彻底解决之前,我们建议开发者更换域名作为临时解决方案。

开发者如何访问 LeanCloud 控制台等服务

将原域名 leancloud.cn 切换成 avoscloud.com 即可:

官网:https://avoscloud.com/
博客:https://blog.avoscloud.com/
健康状态:https://status.avoscloud.com
论坛:https://forum.avoscloud.com

华北节点控制台:https://avoscloud.com/dashboard/
华东节点控制台:https://tab.avoscloud.com
美国节点控制台:https://us.avoscloud.com

华北节点

云引擎

云引擎本身不受影响(因为云引擎内部运行的代码访问 API 走的是内网),但是命令行工具部署代码可能有问题,需要进行如下配置后才能正常使用:

0) 升级命令行工具到最新版 0.20.1

1) 根据具体的环境,执行下列命令:

Shell 环境

export LEANCLOUD_DASHBOARD=https://avoscloud.com
export LEANCLOUD_API_SERVER=https://avoscloud.com

Windows 环境

set LEANCLOUD_DASHBOARD=https://avoscloud.com
set LEANCLOUD_API_SERVER=https://avoscloud.com

2) 使用 lean login 重新登录

当然,如果在云引擎托管网站,其中的客户端 JavaScript 访问 LeanCloud API,
仍然需要按照下面 JavaScript SDK 一节中的方法切换域名。

服务端应用

如果是在自己的服务器上跑的应用(包括通过 REST API 和 SDK),
最简单快捷的方法是修改服务器的 /etc/hosts,加入以下行:

117.50.12.165        leancloud.cn
123.59.50.132        app-router.leancloud.cn
123.59.58.149        router-g0-push.leancloud.cn

此外,还需要加上 {{appid 前八位}}.api.lncld.netapi.leancloud.cn 这两项记录。

这两项记录的 IP 值通过在命令行 dig avoscloud.com 获取(在 ANSWER SECTION 部分查看结果),
dig 命令可能返回多个 IP,任选其一即可。

如果需要访问云函数,还需加上 {{appid 前八位}}.engine.lncld.net 这条记录,IP 值同样通过 dig avoscloud.com 获取。

注意,如果需要在本地调试服务端应用,那么本地机器的 hosts 文件同样需要修改(不同操作系统的 hosts 文件路径不同,请自行搜索相关方法)。

REST API

注意:

  1. 在云引擎内访问 REST API,同样走的是内网,不受影响,无需修改代码。
  2. 服务端访问 REST API 的话,请优先尝试上面提到的修改 /etc/hosts 的方法,不用修改代码。

客户端访问 REST API,需要在代码中将 api.leancloud.cn{{appid 前八位}}.api.lncld.net 域名替换为 avoscloud.com

客户端通过 REST API 访问云函数,需要将 {{appid 前八位}}.engine.lncld.net 替换为 avoscloud.com

SDK

注意:

  1. 云引擎 SDK 不受影响,无需修改代码。
  2. 服务端 SDK,请优先尝试上面提到的修改 /etc/hosts 的方法,不用修改代码。

客户端 SDK 需要进行如下修改:(注意,只有较新版本的 SDK 才支持设定 API 服务器地址)

JavaScript SDK

存储 SDK(3.0.0 以上支持,建议升级到 3.11.1 以上,详情见下)

AV.init({
  // appId, appKey,
  serverURLs: 'https://avoscloud.com',
});

>= 3.5.5, < 3.11.1 的应用可能会碰到仍然使用缓存默认配置的 bug,
更新后应用打开的第一次请求可能失败。

>= 3.0.0, < 3.5.5 的应用 不能按上述方法设置,需要使用如下的写法:

AV.init({
  // appId, appKey,
  serverURLs: {
    push: 'https://avoscloud.com',
    stats: 'https://avoscloud.com',
    engine: 'https://avoscloud.com',
    api: 'https://avoscloud.com',
  },
});

如果你使用了 LiveQuery 功能,还需要在初始化的时候额外指定 LiveQuery 模块的域名配置(需要版本 >= 3.5.0):

AV.init({
  // appId, appKey,
  // serverURLs,
  realtime: new AV._sharedConfig.liveQueryRealtime({
    appId,
    appKey,
    server: 'example.com',
  }),
});

即时通讯 SDK(4.0.0 以上支持)

new Realtime({
  // appId, appKey,
  server: {
    api: 'avoscloud.com',
    RTMRouter: 'router-g0-push.avoscloud.com',
  },
};

多人在线对战 SDK

new Client({
      appId: '',
      appKey: '',
      userId: 'tar1',
      playServer: 'https://game-router-cn-n1.avoscloud.com/v1',
});
微信小程序

微信小程序白名单增加:

存储:
request:https://avoscloud.com

即时通讯:
request:https://router-g0-push.avoscloud.com/
Socket:
wss://cn-n1-cell1.avoscloud.com,
wss://cn-n1-cell2.avoscloud.com,
wss://cn-n1-cell5.avoscloud.com,
wss://cn-n1-cell7.avoscloud.com

多人在线对战:
Request:https://game-router-cn-n1.avoscloud.com/
Socket:
wss://cn-n1-wechat-mesos-cell-1.avoscloud.com
wss://cn-n1-wechat-mesos-cell-2.avoscloud.com
wss://cn-n1-wechat-mesos-cell-3.avoscloud.com
wss://cn-n1-wechat-mesos-cell-4.avoscloud.com

iOS SDK

Objective-C SDK

// 配置 SDK 储存
[AVOSCloud setServerURLString:@"https://avoscloud.com" forServiceModule:AVServiceModuleAPI];
// 配置 SDK 推送
[AVOSCloud setServerURLString:@"https://avoscloud.com" forServiceModule:AVServiceModulePush];
// 配置 SDK 云引擎
[AVOSCloud setServerURLString:@"https://avoscloud.com" forServiceModule:AVServiceModuleEngine];
// 配置 SDK 即时通讯
[AVOSCloud setServerURLString:@"https://router-g0-push.avoscloud.com" forServiceModule:AVServiceModuleRTM];
// 配置 SDK 统计
[AVOSCloud setServerURLString:@"https://avoscloud.com" forServiceModule:AVServiceModuleStatistics];
// 初始化
[AVOSCloud setApplicationId:APP_ID clientKey:APP_KEY];

Swift SDK(16.1.0 以上)

let configuration = LCApplication.Configuration(
    customizedServers: [
        .api("https://avoscloud.com"),
        .engine("https://avoscloud.com"),
        .push("https://avoscloud.com"),
        .rtm("https://router-g0-push.avoscloud.com")
    ]
)
try LCApplication.default.set(
    id: "APP_ID",
    key: "APP_KEY",
    configuration: configuration
)

Android SDK

// 配置 SDK 储存
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.API, "https://avoscloud.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.ENGINE, "https://avoscloud.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.PUSH, "https://avoscloud.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.RTM, "https://router-g0-push.avoscloud.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

Java Unified SDK

import cn.leancloud.core.AVOSService;

// 配置 SDK 储存
AVOSCloud.setServer(AVOSService.API, "https://avoscloud.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSService.ENGINE, "https://avoscloud.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSService.PUSH, "https://avoscloud.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSService.RTM, "https://router-g0-push.avoscloud.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

.NET SDK

AVClient.Initialize(new AVClient.Configuration {
                ApplicationId = appId,
                ApplicationKey = appKey,
                ApiServer = new Uri("https://avoscloud.com"),
                EngineServer = new Uri("https://avoscloud.com")
            });
// 通过 RTM Router 配置即时通讯
var realtime = new AVRealtime(new AVRealtime.Configuration
           {
                ApplicationId = "app-id",
                ApplicationKey = "app-key",
                RTMRouter = new Uri("https://router-g0-push.avoscloud.com")
           });

多人在线对战,v0.5.0-alpha.0 及之后的版本

var client = new Client(appId, appKey, userId, playServer: "https://game-router-cn-n1.avoscloud.com/v1");
await client.Connect();

PHP SDK 和 Python SDK

这两个属于服务端 SDK,请使用上面「服务端应用」一节提到的修改 /etc/hosts 的方法,不用修改代码。

华东节点

华东节点的大部分服务不受此次事件的影响。

云引擎命令行工具

0) 升级命令行工具到最新版 0.20.1

1) 根据具体的环境,执行下列命令:

Shell 环境

export LEANCLOUD_DASHBOARD=https://tab.avoscloud.com
export LEANCLOUD_API_SERVER=https://avoscloud.com

Windows 环境

set LEANCLOUD_DASHBOARD=https://tab.avoscloud.com
set LEANCLOUD_API_SERVER=https://avoscloud.com

2) 使用 lean login 重新登录

JavaScript

即时通讯 SDK

const appId = 'YOUR_APP_ID';
new Realtime({
  // appId, appKey,
  server: {
    api: 'APPID 前八位.api.lncldapi.com',
    RTMRouter: 'APPID 前八位.rtm.lncldapi.com',
  },
};

多人在线对战 SDK

new Client({
      appId: '',
      appKey: '',
      userId: 'tar1',
      playServer: 'https://{{APPID 前八位}}.play.lncldapi.com/1/multiplayer/router',
});

如果在小程序中使用,还需要将 APPID 前八位.api.lncldapi.comAPPID 前八位.rtm.lncldapi.comAPPID 前八位.play.lncldapi.com 添加到域名白名单列表中。

iOS SDK

Objective-C SDK

// 配置 SDK 储存
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.api.lncldapi.com" forServiceModule:AVServiceModuleAPI];
// 配置 SDK 推送
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.push.lncldapi.com" forServiceModule:AVServiceModulePush];
// 配置 SDK 云引擎
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.engine.lncldapi.com" forServiceModule:AVServiceModuleEngine];
// 配置 SDK 即时通讯
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.rtm.lncldapi.com" forServiceModule:AVServiceModuleRTM];
// 配置 SDK 统计
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.stats.lncldapi.com" forServiceModule:AVServiceModuleStatistics];
// 初始化
[AVOSCloud setApplicationId:APP_ID clientKey:APP_KEY];

Swift SDK 升级到最新版即可。

Android SDK

// 配置 SDK 储存
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.API, "https://{{APPID 前八位}}.api.lncldapi.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.ENGINE, "https://{{APPID 前八位}}.engine.lncldapi.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.PUSH, "https://{{APPID 前八位}}.push.lncldapi.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.RTM, "https://{{APPID 前八位}}.rtm.lncldapi.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

Java Unified SDK

import cn.leancloud.core.AVOSService;

// 配置 SDK 储存
AVOSCloud.setServer(AVOSService.API, "https://{{APPID 前八位}}.api.lncldapi.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSService.ENGINE, "https://{{APPID 前八位}}.engine.lncldapi.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSService.PUSH, "https://{{APPID 前八位}}.push.lncldapi.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSService.RTM, "https://{{APPID 前八位}}.rtm.lncldapi.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

.NET SDK

// 配置存储和云引擎
AVClient.Initialize(new AVClient.Configuration {
                ApplicationId = appId,
                ApplicationKey = appKey,
                ApiServer = new Uri("https://{{APPID 前八位}}.api.lncldapi.com"),
                EngineServer = new Uri("https://{{APPID 前八位}}.engine.lncldapi.com")
            });
// 通过 RTM Router 配置即时通讯
var realtime = new AVRealtime(new AVRealtime.Configuration
           {
                ApplicationId = "app-id",
                ApplicationKey = "app-key",
                RTMRouter = new Uri("https://{{APPID 前八位}}.rtm.lncldapi.com")
           });

多人在线对战,v0.5.0-alpha.0 及之后的版本

var client = new Client(appId, appKey, userId, playServer: "https://{{APPID 前八位}}.play.lncldapi.com/1/multiplayer/router");
await client.Connect();

美国节点

美国节点的大部分服务不受此次事件的影响。

云引擎命令行工具

0) 升级命令行工具到最新版 0.20.1

1) 根据具体的环境,执行下列命令:

Shell 环境

export LEANCLOUD_DASHBOARD=https://us.avoscloud.com
export LEANCLOUD_API_SERVER=https://us.avoscloud.com

Windows 环境

set LEANCLOUD_DASHBOARD=https://us.avoscloud.com
set LEANCLOUD_API_SERVER=https://us.avoscloud.com

2) 使用 lean login 重新登录

在 Shell 中执行 export LEANCLOUD_DASHBOARD=; export LEANCLOUD_API_SERVER= 后再运行命令行工具(需要用 lean login 重新登录)

JavaScript

即时通讯 SDK

const appId = 'YOUR_APP_ID';
new Realtime({
  // appId, appKey,
  server: {
    api: 'APPID 前八位.api.lncldglobal.com',
    RTMRouter: 'APPID 前八位.rtm.lncldglobal.com',
  },
};

多人在线对战 SDK

new Client({
      appId: '',
      appKey: '',
      userId: 'tar1',
      playServer: 'https://{{APPID 前八位}}.play.lncldglobal.com/1/multiplayer/router',
});

如果在小程序中使用,还需要将 APPID 前八位.api.lncldglobal.comAPPID 前八位.rtm.lncldglobal.comAPPID 前八位.play.lncldglobal.com 添加到域名白名单列表中。

iOS SDK

Objective-C SDK

// 配置 SDK 储存
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.api.lncldglobal.com" forServiceModule:AVServiceModuleAPI];
// 配置 SDK 推送
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.push.lncldglobal.com" forServiceModule:AVServiceModulePush];
// 配置 SDK 云引擎
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.engine.lncldglobal.com" forServiceModule:AVServiceModuleEngine];
// 配置 SDK 即时通讯
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.rtm.lncldglobal.com" forServiceModule:AVServiceModuleRTM];
// 配置 SDK 统计
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.stats.lncldglobal.com" forServiceModule:AVServiceModuleStatistics];
// 初始化
[AVOSCloud setApplicationId:APP_ID clientKey:APP_KEY];

Swift SDK 升级到最新版即可。

Android SDK

// 配置 SDK 储存
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.API, "https://{{APPID 前八位}}.api.lncldglobal.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.ENGINE, "https://{{APPID 前八位}}.engine.lncldglobal.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.PUSH, "https://{{APPID 前八位}}.push.lncldglobal.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.RTM, "https://{{APPID 前八位}}.rtm.lncldglobal.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

Java Unified SDK

import cn.leancloud.core.AVOSService;

// 配置 SDK 储存
AVOSCloud.setServer(AVOSService.API, "https://{{APPID 前八位}}.api.lncldglobal.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSService.ENGINE, "https://{{APPID 前八位}}.engine.lncldglobal.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSService.PUSH, "https://{{APPID 前八位}}.push.lncldglobal.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSService.RTM, "https://{{APPID 前八位}}.rtm.lncldglobal.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

.Net 即时通讯 SDK

// 配置存储和云引擎
AVClient.Initialize(new AVClient.Configuration {
                ApplicationId = appId,
                ApplicationKey = appKey,
                ApiServer = new Uri("https://{{APPID 前八位}}.api.lncldglobal.com"),
                EngineServer = new Uri("https://{{APPID 前八位}}.engine.lncldglobal.com")
            });
// 通过 RTM Router 配置即时通讯
var realtime = new AVRealtime(new AVRealtime.Configuration
           {
                ApplicationId = "app-id",
                ApplicationKey = "app-key",
                RTMRouter = new Uri("https://{{APPID 前八位}}.rtm.lncldglobal.com")
           });

多人在线对战,v0.5.0-alpha.0 及之后的版本

var client = new Client(appId, appKey, userId, playServer: "https://{{APPID 前八位}}.play.lncldglobal.com/1/multiplayer/router");
await client.Connect();

7 月 15 日起即时通讯和推送 REST API 将开启请求频率限制

尊敬的开发者,

2019 年 7 月 15 日起,我们将对开发版和商用版应用开启直接调用 REST API 进行消息操作(包含即时通讯及推送)的频率限制,以此来提升处理效率和鼓励更合理的设计。客户端通过 LeanCloud SDK 产生的行为不受此限制的约束。商用版应用如有合理的需求希望突破此限制,请联系 support@leancloud.rocks 了解相关的付费方案。

在单位时间内超限的 REST API 请求会被云端拒绝,并返回 429 错误码。因此,请您及时检查应用逻辑,并依据以下列出的最大限制做好相关的适配工作。

限制详情

LeanCloud 云端将所有应用的消息请求放入队列逐一处理。当某一个应用突然大量调用接口发送消息时,该共享队列就会被长时间占用,进而影响其他应用的消息到达速度。为了解决这个问题,我们将对以下请求的频率进行限速。

即时通讯服务

普通消息

1.1 版本:

1.2 版本:

单聊群聊消息接口:

聊天室消息接口:

限制:

商用版 开发版
每应用 1800 次/分钟 每应用 120 次/分钟

所有接口共享以上额度。超过额度限制后一分钟内 LeanCloud 会拒绝请求持续返回 429 错误码,一分钟后会重新处理请求。

订阅消息

1.1 版本:

1.2 版本:

限制:

限制 商用版 开发版
频率限制 每应用 30 次/分钟 每应用 10 次/分钟
总量限制 全天最多 1000 次 全天最多 100 次

所有接口共享以上额度。超过频率限制后 1 分钟内 LeanCloud 会拒绝请求持续返回 429 错误码,一分钟后会重新处理请求;超过总量限制后当天会拒绝之后的所有请求并返回 429 错误码。

广播消息

1.1 版本:

1.2 版本:

限制:

限制 商用版 开发版
频率限制 每应用 10 次/分钟 每应用 1 次/分钟
总量限制 全天最多 30 次 全天最多 10 次

所有接口共享以上额度。超过频率限制后 1 分钟内 LeanCloud 会拒绝请求持续返回 429 错误码,一分钟后会重新处理请求;超过总量限制后当天会拒绝之后的所有请求并返回 429 错误码。

推送服务

限制 商用版 开发版
频率限制 每应用 600 次/分钟 每应用 60 次/分钟
每日推送总量 免费 100 万推送人次/天 免费 1 万推送人次/天

超过频率限制后 1 分钟内 LeanCloud 会拒绝请求持续返回 429 错误码,一分钟后会重新处理请求。

如果您有任何问题,请联系 support@leancloud.rocks。感谢您的配合。

游戏实时对战及排行榜服务将于 4 月 9 日开通商用方案

LeanCloud 游戏实时对战服务及排行榜服务自上线以来受到了众多开发者的青睐,大家熟知的 Google 小游戏《猜画小歌》就是我们游戏服务的用户之一。鉴于商业用户对于云端服务稳定性的要求,我们将于 4 月 9 日起为这两项服务提供免费和付费两种方案,具体如下:

实时对战

实时对战服务从 CCU 和流量两个维度来统计使用量和计费。

  • CCU:同时在线用户数,以当天最高的同时在线用户数为准进行收费。最高支持 5000 CCU,超过 5000 CCU 需使用企业版。收费单位为每 500 CCU,不足 500 按 500 计算。
  • 流量:通信过程中所使用的流量。数据体积越大,通信频率越高,产生的流量也会越大,按照实际用量进行计费。

华北/华东节点

开发版 商用版
CCU 免费 20 CCU / 天 ¥ 25 / 500 CCU / 天
流量 免费 1 GB / 天 ¥ 0.8 / 1 GB / 天

国际节点

开发版 商用版
CCU 免费 20 CCU / 天 $ 4 / 500 CCU / 天
流量 免费 1 GB / 天 $ 0.1 / 1 GB / 天

您可以前往 LeanCloud 控制台 > 游戏 > 实时对战 > 统计 页面查看应用当前的用量。

注:付费方案仅涉及实时对战通讯云部分,Client Engine 服务将继续免费使用。

排行榜

排行榜服务按照请求数量和存储空间来统计和计费。

  • 请求数量:调用排行榜相关接口的请求总数量。收费单位为 1 万次请求,不足 1 万按 1 万次计算。
  • 存储空间:
    • 按照榜单内的总记录数进行收费,包括当前版本的总记录数,以及可选保留的上一个版本总记录数。例如您有一个排行榜 world,除了当前版本的榜单外,还选择保留一份历史版本数据供客户端查询,当前版本的榜单内有 2 万条数据,上一个历史版本中有 1 万条数据,总记录数为 2 万 + 1 万 =  3 万条数据。
    • 收费单位为 1 万条,不足 1 万按 1 万条记录计算。

华北/华东节点

开发版 商用版
请求数量 免费 1 万次请求 / 天 ¥ 2.5 / 万次请求 / 天
存储空间 免费 1 万条榜单记录数 ¥ 0.05 / 1 万条榜单记录 / 天

国际节点

开发版 商用版
请求数量 免费 1 万次请求 / 天 $ 0.4 / 万次请求 / 天
存储空间 免费 1 万条榜单记录数 $ 0.01 / 1 万条榜单记录 / 天

您可以前往 LeanCloud 控制台 > 统计 > 排行榜 > 统计 页面查看该服务的使用量。

如果您有任何疑问,请发邮件至 support@leancloud.rocks  或提交工单来咨询。

LeanCloud 排行榜,提升用户活跃度的新招数

排行榜是每款游戏的必备功能。它最直接的作用是通过实力排名和曝光率来提高玩家们在游戏中参与度,让他们为了捍卫自己或团队的荣誉而持续投入精力和时间,乐此不疲。同时它也适用于游戏之外的其他场景,比如在教育类应用中的学生成绩排名,电商应用中店铺或产品销量排名等等。排行榜还可以通过不同的量化指标来用户进行细分,来更准确地了解和解决用户的需求,例如热歌榜、新歌榜、全球榜、MTV 榜等等。这样不仅极大地丰富了应用的使用和玩法,还提高了用户粘性。

针对这些场景的共性,我们推出了「LeanCloud 排行榜」这项新服务,来帮助开发者更快地在自己的应用中实现排名功能。

产品功能

  • 自动计算排名:排行榜中玩家数据一旦被更新,系统将重新计算排名。
  • 获取前排数据:获取在当前排行榜中排名前 N 个的玩家数据。
  • 获取当前玩家的排名
  • 获取与当前玩家排名相临近的数据:例如为当前玩家寻找水平相当的对手或好友。
  • 数据重置:支持自动定期重置或手动重置数据,比如在一个赛季结束之时或在指定天、周、月后自动重置排行榜,或是在应用测试阶段、应用数据出现误差的情况下进行手动重置。
  • 简便的数据更新模式:提供两种分数更新模式,better 模式会保留玩家的最好成绩,last 会保留玩家的最新成绩。

详细的使用方法请阅读《排行榜总览》《快速入门》《开发指南 · JavaScript》。

价格

当前该服务处于公测阶段,所有应用均不收取任何费用。
每一应用每天可以发起 10 万次排行榜 API 请求。如果您需要更大额度,请联系 support@leancloud.rocks。

LeanCloud Play 对战游戏服务正式上线

LeanCloud Play 现在已经正式发布,感谢申请内测的所有用户的支持。所有老应用及新创建的应用都可以直接使用 Play 服务,您只需要在游戏引擎中填入对应的 App ID 和 App Key 即可接入 Play。如果您在接入时遇到任何问题,请到社区发起新的主题,并附上如何重现场景的描述及关键代码,我们的开发工程师会给予回复。

Play 简介

Play 是专门针对多人在线对战游戏推出的后端服务。开发者不需要自己搭建后端系统,利用 Play 云服务就可以轻松实现游戏内玩家匹配、在线对战消息同步等功能。Play 完美适配 Unity 引擎,支持多个平台。

Play 使用起来非常简单:

连接服务器

Play.UserID = "Mario";
Play.Connect("1.0"); // 声明游戏版本

随机匹配房间

Play.JoinRandomRoom();

游戏内发送消息

// 定义名为 rpcResult 的 RPC 方法
[PlayRPC]
public void rpcResult(int winnerId)
{
  Debug.Log("winnerId: " + winnerId);
  ui.showWin();
}
// 向所有人发送游戏消息,收到消息的玩家的 rpcResult 方法会自动被触发
Play.RPC("rpcResult", PlayRPCTargets.All, winnerId);

更详细的介绍请参考《Play 服务总览》。

Play 的未来规划

  • Play 已实现在客户端运算游戏逻辑,服务端运算部分正在研发中,预计不久就可以开放公测。
  • Play 已经支持使用 Unity (C#) 来开发,未来会支持 Cocos、Erget (JavaScript) 及更多的游戏引擎。

如果您有兴趣了解 Play 的新功能或支持的新语言,请订阅我们的博客来接收最新的产品信息。

价格

Play 目前处于免费试用阶段,开发版及商用版应用均不收费。每一应用最多可使用 100 CCU 的额度,如果您需要更大的额度,请联系 support@leancloud.rocks。

LeanCloud Play 内测邀请—不搭建后端,快速上线多人对战游戏

如果您准备打造一款多人对战游戏,正在寻找合适的后端平台与开发资源,那么我们诚邀您加入 LeanCloud 新产品「Play」内测。

LeanCloud Play 提供了稳定和方便的后端接口使您快速完成多人游戏的研发和上线。与其为复杂的后端架构忧心,为组建和管理后端及运维团队烦恼,为项目范畴太大而憔悴,不如使用 LeanCloud Play 来节省至少 60% 时间和人力成本,让产品准时上线,抢占市场。

产品功能

  • 玩家匹配:随机或按指定条件将玩家匹配到一起玩游戏。就像《第五人格》、《吃鸡》等对战类手游,玩家只需点击「自由匹配」就可以随机匹配进入某个房间,或者玩家也可以自己新开房间。
  • 多人在线对战:客户端与服务端使用 WebSocket 通道进行实时双向通信,确保游戏内所有消息能够快速同步。
  • 游戏逻辑运算:由主客户端控制游戏逻辑。当主客户端掉线时,LeanCloud Play 会自动将网络状态最好的客户端切换为主客户端,确保游戏顺畅进行;您也可以选择在服务端编写游戏逻辑(服务端游戏逻辑支持尚在开发中)。
  • 多平台支持:完美适配 Unity 引擎,支持多个平台,同时也欢迎您提出其他语言的需求。

全球支持,灵活稳定

LeanCloud Play 为您提供国内外节点,满足您向全球推广和发行游戏的需求。Play 服务端沿用了 LeanCloud 现有的可横向扩展的架构,支持动态扩容,从容应对海量用户;同时又在这些久经考验的底层架构上进行了深度优化与改进,可以稳定承接每秒亿级的消息下发量。

如何使用

使用 LeanCloud Play 的步骤非常简单。

连接服务器

Play.UserID = "Mario";
Play.Connect("1.0"); // 声明游戏版本

随机匹配房间

Play.JoinRandomRoom();

游戏内发送消息

// 定义名为 rpcResult 的 RPC 方法
[PlayRPC]
public void rpcResult(int winnerId)
{
  Debug.Log("winnerId: " + winnerId);
  ui.showWin();
}
// 向所有人发送游戏消息,收到消息的玩家的 rpcResult 方法会自动被触发
Play.RPC("rpcResult", PlayRPCTargets.All, winnerId);

更详细的文档及教程请阅读《Play 服务总览》、《Play 快速入门》和《Play · Unity (C#) 开发指南》。

申请内测

我们将邀请 10 名用户参与内测,通过微信群与我们的 Play 研发工程师保持沟通。您的反馈将会影响 LeanCloud Play 未来的发展方向,我们期待着与您共同打造优秀的游戏产品!

⚔️ 点击此处申请内测 ⚔️