ShareDB:构建实时应用从未如此简单

项目介绍

ShareDB 是一个支持多用户实时协作的全栈库,适用于构建各种需要同步数据更新的在线应用,如在线文档编辑器、实时仪表板和多玩家游戏等。

它提供了一套全面的实时同步和多用户协作解决方案,具备异步最终一致性、实时查询订阅、数据库集成、水平扩展、字段投影、中间件支持、跨平台使用、离线更改同步、内存数据库测试、历史版本访问和实时用户状态同步等特性。

ShareDB 包括一个 Node.js 服务器,用于协调和提交来自多个客户端的编辑,以及一个可在 Node.js 或浏览器中运行的 JavaScript 客户端,用于操作文档。核心通过操作转换(OT)来处理底层的冲突管理,其实现由 ShareDB 的类型插件负责。

项目安装

bash 复制代码
npm install --save sharedb

如果服务器和客户端有不同的依赖,ShareDB 应该被添加到两个包中。

也可以安装其他的OT类型。具体类型查看地址:share.github.io/sharedb/typ...

基本使用

Node服务端

服务端示例使用 Expressws 作为 WebSocket 服务器,并使用 @teamwork/websocket-json-stream 扩展将 WebSocket 转换为 Stream

javascript 复制代码
var express = require('express')
var WebSocket = require('ws')
var http = require('http')
var ShareDB = require('sharedb')
var WebSocketJSONStream = require('@teamwork/websocket-json-stream')

var app = express()
var server = http.createServer(app)
var webSocketServer = WebSocket.Server({server: server})

var backend = new ShareDB()
webSocketServer.on('connection', (webSocket) => {
  var stream = new WebSocketJSONStream(webSocket)
  backend.listen(stream)
})

server.listen(8080)

客户端

客户端示例使用 ShareDBConnection 来获取文档,订阅文档变化,并在浏览器中增加计数器的值。

javascript 复制代码
var ReconnectingWebSocket = require('reconnecting-websocket')
var Connection = require('sharedb/lib/client').Connection

var socket = new ReconnectingWebSocket('ws://localhost:8080', [], {
  // ShareDB handles dropped messages, and buffering them while the socket
  // is closed has undefined behavior
  maxEnqueuedMessages: 0
})
var connection = new Connection(socket)

var doc = connection.get('doc-collection', 'doc-id')

doc.subscribe((error) => {
  if (error) return console.error(error)

  // If doc.type is undefined, the document has not been created, so let's create it
  if (!doc.type) {
    doc.create({counter: 0}, (error) => {
      if (error) console.error(error)
    })
  }
});

doc.on('op', (op) => {
  console.log('count', doc.data.counter)
})

window.increment = () => {
  // Increment the counter by 1
  doc.submitOp([{p: ['counter'], na: 1}])
}

适配器

数据库适配器

ShareDB 支持多种数据库,包括MemoryDBShareDBMongoShareDBMingoMemoryShareDBPostgres

使用方式:

javascript 复制代码
const backend = new Backend({
  db: new MemoryDB(),
})

发布/订阅适配器

发布/订阅(pub/sub)适配器,包括内存型(MemoryPubSub)Redis(ShareDBRedisPubSub)WebSocket总线(ShareDBWSBusPubSub)适配器

使用方式:

javascript 复制代码
const backend = new Backend({
  pubsub: new MemoryPubSub(),
})

里程碑适配器

ShareDB 的里程碑适配器目前只支持 ShareDBMilestoneMongo,它用于存储文档的定期快照以加速文档历史记录的访问,并通过中间件自定义快照行为。

官方示例

计数器

排行榜

更多官方示例可以下方地址中查阅:

github.com/share/share...

总结

github地址:github.com/share/share...

我们在服务端代码中演示了如何设置 Express 应用、WebSocket 服务器和流式转换。

在客户端代码演示了创建 WebSocket,连接到 ShareDB 服务器,获取文档,订阅文档操作,以及如何提交操作来更新文档。

介绍了 ShareDB 适配器的支持情况和基本使用。

希望通过对ShareDB的简单介绍,能对你了解和使用它有一定的帮助。

-- 欢迎点赞、关注、转发、收藏【我码玄黄】,gonghao同名

相关推荐
烛阴2 分钟前
武装你的Python“工具箱”:盘点10个你必须熟练掌握的核心方法
前端·python
苏打水com2 分钟前
数据库进阶实战:从性能优化到分布式架构的核心突破
数据库·后端
sorryhc18 分钟前
如何设计一个架构良好的前端请求库?
前端·javascript·架构
lvchaoq43 分钟前
react 修复403页面无法在首页跳转问题
前端·javascript·react.js
郝开1 小时前
6. React useState基础使用:useState修改状态的规则;useState修改对象状态的规则
前端·javascript·react.js
间彧1 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧1 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧1 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧1 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧1 小时前
Spring Cloud Gateway详解与应用实战
后端