51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

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

image

项目介绍

image

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

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

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

项目安装

npm install --save sharedb

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

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

基本使用

Node服务端

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

var express =require('express')
varWebSocket=require('ws')
var http =require('http')
varShareDB=require('sharedb')
varWebSocketJSONStream=require('@teamwork/websocket-json-stream')

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

var backend =newShareDB()
webSocketServer.on('connection',(webSocket) =>{
var stream =newWebSocketJSONStream(webSocket)
  backend.listen(stream)
})

server.listen(8080)

客户端

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

var ReconnectingWebSocket=require('reconnecting-websocket')
varConnection=require('sharedb/lib/client').Connection

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

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

doc.subscribe((error) =>{
if(error)returnconsole.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

使用方式:

const backend = new Backend({
  db: new MemoryDB(),
})

发布/订阅适配器

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

使用方式:

const backend = new Backend({
  pubsub: new MemoryPubSub(),
})

里程碑适配器

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

官方示例

计数器 image

排行榜 image

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

https://github.com/share/sharedb/tree/master/examples

总结

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

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

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

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

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

-- 欢迎点赞、关注、转发、在看【我码玄黄】

赞(5)
未经允许不得转载:工具盒子 » ShareDB:构建实时应用从未如此简单