如何实现我自己的后台和我的手机应用程序之间的实时同步?
How to achieve realtime synchronization between my own back-end and my mobile app?
我有点嫉妒像 Google Cloud Firestore 这样的服务,它实现了移动应用程序(或网络应用程序)和后端之间的实时同步。它让我把普通的 HTTP GET 后端视为史前时代。
我想知道,在 2O19 年,是否存在 simple/scalable solutions/frameworks 在我自己的后端实现此目的。
我听说过套接字,但它看起来很昂贵而且很难安装(也许我错了)。也许是无声通知? (但这又增加了一层管理的复杂性,我们不能 100% 相信每个通知都会达到其目标)。
我知道冲突是最敏感的话题,所以即使是只读解决方案(只有后端可以修改实体)也会很棒。
数据实时同步有解决方案。他们中的大多数使用 WebSockets 或 SSE(服务器端事件)进行传输,这也适用于 Google Cloud Firestore。而现有的解决方案很多都是具有同步能力的数据库,就像Firestore一样。但也有其他选择。
现有解决方案
假设您不是在寻找推送解决方案,例如 PubNub or Pusher,而是在寻找数据的无缝同步,那么我可以提一些帮助您入门的方法:
使用 Resgate 的示例
实时 API 网关,例如 Resgate(我 clearly baised 支持它 :)),让您可以用您选择的语言编写(微)服务,方式与您编写的方式类似一个普通的 HTTP 网络服务。然后网关以 REST 和实时方式公开资源 API,并保持客户端同步。
C# 服务使用 ResgateIO.Service
ResService service = new ResService("example");
service.AddHandler("mymodel", new DynamicHandler()
.SetGet(r => r.Model(new {
message = "Hello, World!",
}))
.SetAccess(r => r.AccessGranted()));
service.Serve("nats://127.0.0.1:4222");
但除此之外,您还可以发送事件来更新和同步所有客户端:
service.With("example.mymodel", r => r.ChangeEvent(new Dictionary<string, object> {
{ "message", "Hello, Whosebug!" }
}));
然后客户端可以获取数据并监听更新:
Javascript 客户端使用 ResClient
let client = new ResClient('ws://localhost:8080');
client.get('example.mymodel').then(model => {
console.log(model.message); // Hello, World!
model.on('change', () => {
console.log(model.message); // Updated to: Hello, Whosebug!
});
});
注意事项
上面提到的所有解决方案(还有更多供寻求者使用)在以下方面各有优缺点:
- 弹性 - 处理丢失的消息和连接
- 访问控制 - 授予访问权限和撤消对订阅的访问权限
- 实时查询 - 获取实时更新的部分或过滤数据
- 离线支持 - 离线处理数据
- 缩放
- 数据库要求
- 使用简单
环顾四周,看看哪种解决方案最适合您的需求。
我有点嫉妒像 Google Cloud Firestore 这样的服务,它实现了移动应用程序(或网络应用程序)和后端之间的实时同步。它让我把普通的 HTTP GET 后端视为史前时代。
我想知道,在 2O19 年,是否存在 simple/scalable solutions/frameworks 在我自己的后端实现此目的。 我听说过套接字,但它看起来很昂贵而且很难安装(也许我错了)。也许是无声通知? (但这又增加了一层管理的复杂性,我们不能 100% 相信每个通知都会达到其目标)。
我知道冲突是最敏感的话题,所以即使是只读解决方案(只有后端可以修改实体)也会很棒。
数据实时同步有解决方案。他们中的大多数使用 WebSockets 或 SSE(服务器端事件)进行传输,这也适用于 Google Cloud Firestore。而现有的解决方案很多都是具有同步能力的数据库,就像Firestore一样。但也有其他选择。
现有解决方案
假设您不是在寻找推送解决方案,例如 PubNub or Pusher,而是在寻找数据的无缝同步,那么我可以提一些帮助您入门的方法:
使用 Resgate 的示例
实时 API 网关,例如 Resgate(我 clearly baised 支持它 :)),让您可以用您选择的语言编写(微)服务,方式与您编写的方式类似一个普通的 HTTP 网络服务。然后网关以 REST 和实时方式公开资源 API,并保持客户端同步。
C# 服务使用 ResgateIO.Service
ResService service = new ResService("example");
service.AddHandler("mymodel", new DynamicHandler()
.SetGet(r => r.Model(new {
message = "Hello, World!",
}))
.SetAccess(r => r.AccessGranted()));
service.Serve("nats://127.0.0.1:4222");
但除此之外,您还可以发送事件来更新和同步所有客户端:
service.With("example.mymodel", r => r.ChangeEvent(new Dictionary<string, object> {
{ "message", "Hello, Whosebug!" }
}));
然后客户端可以获取数据并监听更新:
Javascript 客户端使用 ResClient
let client = new ResClient('ws://localhost:8080');
client.get('example.mymodel').then(model => {
console.log(model.message); // Hello, World!
model.on('change', () => {
console.log(model.message); // Updated to: Hello, Whosebug!
});
});
注意事项
上面提到的所有解决方案(还有更多供寻求者使用)在以下方面各有优缺点:
- 弹性 - 处理丢失的消息和连接
- 访问控制 - 授予访问权限和撤消对订阅的访问权限
- 实时查询 - 获取实时更新的部分或过滤数据
- 离线支持 - 离线处理数据
- 缩放
- 数据库要求
- 使用简单
环顾四周,看看哪种解决方案最适合您的需求。