processflow基于私有云存储的多人实时协作尝试

news2024/12/24 8:48:16

前言

继上一篇基于oneDrive实现多人协作之后,发现Onedrive存在诸多限制之处,比如国内网络环境很差,多人协作还需要processflow用户自己注册oneDrive账号,然后oneDrive系统内进行文件分享,才能拿到分享链接进行多人协作。过程可谓是相当之繁琐。后面便萌生了基于一些开源的分布式文件多版本存储系统代替oneDrive的功能,经历了一个多月的尝试,最终得到了我想要的结果。实现了私有云多版本文件存储服务(这里大家可以参考一下seafile和nextcloud,我这里选则的是seafile,因为是用C写的,性能更好,而且从技术架构角度考虑,前后端分离更适合二次开发,换皮啥的;nextcloud就是太丑了,基于php宇宙第一开发语言写的,接口数据格式相当恶心,全部都是xml,层层封装,和他交互起来太繁琐)。在这基础之上,便开始了processflow的多人协作功能的进化。

技术介绍

主要使用了websocket技术+多版本管理的文件存储服务,websocket主要传递用户的鼠标移动轨迹和事件行为传递作用,使用了广播模式对用户事件进行发布。当用户修改了流程图文件,会将变动的内容通过websocket广播到各个web客户端。内容的存储和变动内容合并则是通过文件存储服务来实现。

websocket通信原理:

多人协作组会话管理:

利用协作文件的uid或hash值作为channeld,每个channel中会管理一个map,map中维护每个协作者的clientId和sessionId。拿到sessionId再去获取内存中的session来与客户端进行通信。

 

seafile分布式架构设计: 

Seafile 的文件版本管理基于 Git 版本控制系统,并结合了一些自定义的特性来满足文件同步和共享的需求。以下是 Seafile 文件版本管理的基本原理: 

  •  Git 版本控制系统:Seafile 使用 Git 作为底层的版本控制系统。Git 是一种分布式版本控制系统,它可以跟踪文件的每个修改,并记录这些修改的历史。
  • 文件快照:在 Seafile 中,每当文件发生变化时,会创建一个文件快照。文件快照是文件在特定时间点的副本,用于记录文件的状态和内容。
  • 增量存储:为了节省存储空间和提高效率,Seafile 使用增量存储机制。当文件发生变化时,只有发生变化的部分会被保存为新的快照,而不是完整地复制整个文件。
  • 版本标记:每个文件快照都有一个唯一的版本标记,用于标识该快照的位置和顺序。通过版本标记,可以轻松地查找和恢复特定版本的文件。
  • 差异比较和合并:Seafile 可以比较不同版本的文件快照之间的差异,并根据需要进行合并。这使得多个用户可以同时编辑同一个文件,并将其更改合并到最新版本中。
  • 回滚和恢复:通过版本管理功能,Seafile 允许用户回滚到先前的文件版本或恢复已删除的文件。这对于修复错误、还原误操作或检索旧版本的文件非常有用。
  • 冲突解决:当多个用户同时编辑同一个文件时,可能会发生冲突。Seafile 提供了冲突解决机制,允许用户手动解决冲突或自动合并冲突。

在processflow的版本管理中,主要用到了ETag(实体标签)和时间戳两种保障机制机制,用于标识和比较资源的不同版本。它们的作用如下:
ETag:ETag 是一个由服务器生成的唯一标识符,用于表示资源的特定版本。当客户端请求某个资源时,服务器会将该资源的 ETag 值返回给客户端。客户端可以在后续请求中将该 ETag 值发送给服务器,以便服务器判断资源是否发生了变化。如果资源的 ETag 值与客户端发送的值匹配,则表示资源未发生变化,服务器可以返回一个 304 Not Modified 状态码,告知客户端使用缓存的版本。如果 ETag 值不匹配,则表示资源已经发生了变化,服务器会返回新的资源内容。
时间戳:时间戳是指资源的最后修改时间。当客户端请求某个资源时,服务器会将该资源的最后修改时间返回给客户端。客户端可以在后续请求中将该时间戳发送给服务器,以便服务器判断资源是否发生了变化。如果资源的最后修改时间与客户端发送的时间戳相同,则表示资源未发生变化,服务器可以返回一个 304 Not Modified 状态码,告知客户端使用缓存的版本。如果时间戳不同,则表示资源已经发生了变化,服务器会返回新的资源内容。
这两种机制都可以用于减少网络传输和服务器负载,提高资源访问效率。选择使用哪种机制取决于具体的应用场景和需求。ETag 更加精确,可以识别出资源内容的任何变化,但需要服务器计算和存储额外的标识符。时间戳则更加简单,只需要记录资源的最后修改时间,但无法捕捉到内容没有发生变化但是重新生成了相同内容的情况。 

import requests

url = "https://example.com/resource"
headers = {}

# 发送第一次请求,获取资源和相关信息
response = requests.get(url)
etag = response.headers.get("ETag")
last_modified = response.headers.get("Last-Modified")

# 在后续请求中发送 ETag 或时间戳
if etag:
    headers["If-None-Match"] = etag
if last_modified:
    headers["If-Modified-Since"] = last_modified

# 发送带有 ETag 或时间戳的请求
response = requests.get(url, headers=headers)

# 根据服务器返回的状态码处理结果
if response.status_code == 304:
    # 资源未发生变化,使用缓存的版本
    print("Using cached version.")
else:
    # 资源已经发生变化,使用新的版本
    print("Using updated version.")
    print(response.text)

申请体验

目前系统多人协作功能处于试用阶段,想体验的小伙伴可以联系我添加操作权限,即可开始体验该功能。 

https://images.sharehoo.cn/Video_2023-09-24_213953.mp4icon-default.png?t=N7T8https://images.sharehoo.cn/Video_2023-09-24_213953.mp4 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1043587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文教你学会Makefile脚本的简单应用

一文教你学会Makefile脚本的简单应用 一.什么是Makefile脚本二.Makefile语法三.使用Makefile编译多个文件3.1 运行脚本3.2 利用Makefile删除不必要文件 四.Makefile进阶语法4.1在Makefile中使用变量4.2 Makefile中通配符 五.总结 一.什么是Makefile脚本 Makefile其实就是一种脚…

Nginx:location与rewrite

目录 一.location与rewrite区别 1.1.基于Nginx的location与rewrite常用的正则表达式(Nginx的正则表达式) 二.location模块 2.1.location的三种匹配类别 2.2.location的常用匹配规则 2.3.location匹配优先级 2.4.location模块使用实例 三.rewrite…

第2讲:Vue开发环境的搭建及运行

Vue开发环境搭建步骤 1、安装node http://www.nodejs.com.cn/ 一般安装在根目录下,直接下一步下一步安装即可。如何检测安装完毕 node -v 2、第二步:安装vue-cli脚手架 npm install -g vue/cli ,查看安装版本 vue --version 3、第…

Buildroot添加自定义文件

在日常开发中,我们经常会向buildroot文件系统里添加自定义文件。本文介绍几种添加的方法 一、buildroot/system/skeleton目录 skeleton能够在目标文件系统编译完成后将指定文件覆盖到某个目录。通过这种方式,我们可以方便地添加或修改一些文件到根文件系…

【lesson11】环境变量

文章目录 环境变量的认识main函数参数问题 环境变量的认识 我们知道我们运行自己写的可执行程序的时候,我们必须带路径才能运行,可是执行系统指令的时候不用路径就能运行。 演示: 问题:系统命令可以直接运行,自己写…

单链表详细解析|画图理解

前言: 在前面我们学习了顺序表,相当于数据结构的凉菜,今天我们正式开始数据结构的硬菜了,那就是链表,链表有多种结构,但我们实际中最常用的还是无头单向非循环链表和带头双向循环链表,我们今天先…

删除表

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: drop table 表名; 说明:连同表结构、表中的数据都删除 案例:删除test03表,并验证 mysql> desc test03; ---…

安装Pymc3模块包问题记录

首先跟着各个方法安装,都不行,导入pymc3包时,就会报各种错;最后找了好几个博客跟着修改,最终才把pymc3包安装上了,也能导入进去了。 重新整理下安装步骤: 1、下载安装Anaconda3: …

【趣味JavaScript】5年前端开发都没有搞懂toString和valueOf这两个方法!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

在C或C++中查找内存泄漏

编程软件中的内存泄漏可能很难精确定位,因为这里面有大量的数据。本文中,您可以学习如何借助运行时错误检测工具查找C和C应用程序中的内存泄漏。 什么是内存泄漏?C和C语言实例 What Is a Memory Leak? 当您面临内存泄漏时,C和C…

师德师风演讲稿写作格式:如何用三句话吸引听众的注意力

写师德师风演讲稿时,可以按照以下格式进行写作: 1. 开头部分: a. 引起听众的兴趣,可以使用一个引人入胜的故事、一个有趣的事实或者一个引人思考的问题。 b. 简要介绍自己以及演讲的主题。 2. 主体部分: a. 阐述师…

多维时序 | MATLAB实现GWO-BP多变量时间序列预测(灰狼算法优化BP神经网络)

多维时序 | MATLAB实现GWO-BP多变量时间序列预测(灰狼算法优化BP神经网络) 目录 多维时序 | MATLAB实现GWO-BP多变量时间序列预测(灰狼算法优化BP神经网络)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.MATLAB实现GWO-BP多变量时间序列预测(灰狼算法优化BP神经网络)&…

华为云云耀云服务器L实例评测 | 云服务器搭建自己的gitlab代码仓库手把手教学

📋 前言 🖱 博客主页:在下马农的碎碎念🤗 欢迎关注🔎点赞👍收藏⭐️留言📝✍ 本文由在下马农原创,首发于CSDN📆 首发时间:2023/09/26📅 最近更新时…

crypto:Quoted-printable

题目 解压文件后可得到提示文本 好了这个没接触过,参考别的大佬wp QP为可打印字符编码,根据加密方式任何一个8位的字节值可编码为3个字符:一个等号“”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值。 利用网…

完全背包 动态规划 + 一维dp数组

动态规划:完全背包理论基础 每件商品都有无限个!!! (1)0-1背包的核心代码 解决0-1背包问题(方案二):一维dp数组(滚动数组)_呵呵哒( ̄…

CodeWhisperer,非常丝滑的AI代码神器

文章目录 什么是 Amazon CodeWhisperer?快速上手CodeWhisperer安装配置如何使用 Amazon CodeWhispererCodeWhisperer初体验:hello world Python语言快速入门向文件写入数据读取csv文件排序算法之冒泡排序设计模式之单例模式 使用CodeWhisperer快速上手Py…

这本书竟然把JAVA讲的如此透彻!漫画JAVA火爆出圈!

亲爱的粉丝们,你是否曾经为学习JAVA而苦恼?繁复的代码和复杂的逻辑常常让人感到头大。不过,今天我要为大家介绍一本神奇的书——《漫画JAVA》,它以图文并茂的方式,轻松诙谐地讲解了JAVA的方方面面。在这篇文章中&#…

基于.Net Core实现自定义皮肤WidForm窗口

前言 今天一起来实现基于.Net Core、Windows Form实现自定义窗口皮肤,并实现窗口移动功能。 素材 准备素材:边框、标题栏、关闭按钮图标。 窗体设计 1、创建Window窗体项目 2、窗体设计 拖拉4个Panel控件,分别用于:标题栏、关…

LabVIEW开发实时自动化多物镜云计算全玻片成像装置

LabVIEW开发实时自动化多物镜云计算全玻片成像装置 数字病理学领域正在迅速发展,这主要是由于计算机处理能力、数据传输速度、软件创新和云存储解决方案方面的技术进步。因此,病理科室不仅将数字成像用于图像存档等简单任务,还用于远程病理学…

无菌生产使用的纯蒸汽质量检测必要性及验证服务

纯蒸汽常被用于制药行业的无菌生产中。无菌生产所用到的物料、容器、设备等物品需要使用纯蒸汽进行湿热灭菌处理。纯蒸汽的主要检测指标,如微生物限度、电导率、TOC等应满足《中华人民共和国药典》中注射用水的质量指标规定。 当纯蒸汽用于湿热灭菌时,为…