如何实现我自己的后台和我的手机应用程序之间的实时同步?

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!
   });
});

注意事项

上面提到的所有解决方案(还有更多供寻求者使用)在以下方面各有优缺点:

  • 弹性 - 处理丢失的消息和连接
  • 访问控制 - 授予访问权限和撤消对订阅的访问权限
  • 实时查询 - 获取实时更新的部分或过滤数据
  • 离线支持 - 离线处理数据
  • 缩放
  • 数据库要求
  • 使用简单

环顾四周,看看哪种解决方案最适合您的需求。