ห้องสมุด Operational Transformation?


102

ฉันกำลังมองหาไลบรารีที่จะช่วยให้ฉันสามารถซิงโครไนซ์ข้อความแบบเรียลไทม์ระหว่างผู้ใช้หลายคน (เช่น Google Docs)

ฉันสะดุดกับ Operational Transformation ซึ่งดูเหมือนจะตรงกับความต้องการของฉัน ต้องบอกว่าฉันเข้าใจสาระสำคัญของ OT แต่ไม่ใช่คณิตศาสตร์หรือการนำ OT ไปใช้

ดังนั้นฉันจึงสงสัยว่ามีไลบรารี Javascript drag'n'drop ที่จะต่อเข้ากับพื้นที่ข้อความสร้างการแปลงจากนั้นอนุญาตให้ฉันใช้การแปลงเหล่านั้นกับไคลเอนต์อื่นหรือไม่

(ฉันได้รับแหล่งที่มา Etherpad แล้ว แต่ฉันไม่สามารถแยกส่วนหัวหรือก้อยออกมาได้หากใครสามารถชี้ให้เห็นถึงวิธีใช้ประโยชน์จากการใช้งาน OT ของ Etherpad ก็จะดีมากเช่นกัน!)


โปรแกรมแก้ไขข้อความสำหรับการทำงานร่วมกันขับเคลื่อนโดย Firebase ชื่อ Firepad - firepad.ioตรวจสอบโค้ดเพื่อรับแรงบันดาลใจgithub.com/FirebaseExtended/firepad
Tharanga Hewavithana

คำตอบ:


57

ฉันคิดว่าบางส่วนของการใช้ OT ของ Google Wave เป็นโอเพ่นซอร์ส (และส่วนอื่น ๆ กำลังจะมา)

ฉันไม่แน่ใจว่านี่คือสิ่งที่คุณกำลังมองหาหรือไม่ แต่ทางเลือกอื่นสำหรับ OT คือการซิงโครไนซ์ที่แตกต่างกัน :


6
Diff-Match-Patch รวมกับกระดาษ Synchronization Differential โดย Neil Frasier ( neil.fraser.name/writing/sync ) ทำเคล็ดลับ! ขอบคุณมากที่ชี้ให้ฉันไปในทิศทางที่ถูกต้อง
gamers2000

จากสิ่งที่ฉันเข้าใจ Diff-Match-Patch และโดยส่วนขยาย MobWrite (เนื่องจากรุ่นหลังใช้แบบเดิม) รองรับเฉพาะข้อความไม่ใช่การเปลี่ยนแปลงไบนารี อย่างไรก็ตามมีการสาธิตการทำงานร่วมกันกับองค์ประกอบรูปแบบ HTML ซึ่งจะบ่งชี้ว่าไม่สนับสนุนเฉพาะข้อความธรรมดา
gamers2000

มีข่าวดีเกี่ยวกับ "และส่วนอื่น ๆ กำลังจะมา" ตั้งแต่คำตอบนี้
bertie

3
ที่จริงแล้ว Google-Diff-Match-Patch มีวัตถุประสงค์เพื่อใช้วิธีการอื่นในการแปลงการดำเนินงานซึ่งเป็นการซิงโครไนซ์ที่แตกต่างเพื่อทำความเข้าใจความแตกต่างที่คุณสามารถอ่านเอกสาร Neil Fraser ของ DS: neil.fraser.name/writing/sync (OT ถูกอ้างถึงในเอกสารนี้ว่าเป็นเหตุการณ์ผ่าน) เป็นสองวิธีที่แตกต่างกันมาก
เบญจา

5
นี่เก่า แต่ในกรณีที่คุณคิดฉันได้เปิดgithub.com/benjamine/JsonDiffPatchมันใช้ Diff-Match-Patch ของ Neil สำหรับสตริงที่ยาว แต่ใช้ได้กับกราฟวัตถุ js ตามอำเภอใจ
เบญจา

44

หนึ่งในวิศวกรอดีตคลื่นได้เปิดตัวการดำเนินงานของ CoffeeScript ShareJS ขั้นตอนวิธีการแก้ไขที่เรียกว่าการทำงานร่วมกันตอนนี้ชื่อShareDB


1
ShareJS น่าจะง่ายกว่าและมีเอกสารดีกว่าและสามารถนำกลับมาใช้ใหม่ได้มากกว่าสิ่งที่ MobWrite ทำกับ Diff และ Patch ของ Google
Luke Stanley

33

ฉันจะสรุปวิธีแก้ปัญหาที่ฉันพบ

  • การเปลี่ยนแปลงการดำเนินงาน: เช่น

    • Google Wave OT วิธีการนี้เป็นไปตามวิธีที่เรียกว่าดาวพฤหัสบดี
    • ShareJs. ใช้อัลกอริทึม OT เดียวกับ Google Wave OT
    • Coweb-jsoe ขึ้นอยู่กับ COT - วิธีการ OT ที่ซับซ้อนมากซึ่งรองรับการเผยแพร่ข้อความ p2p
    • OpenCoweb มันใช้ประโยชน์จาก OpenCoweb-jsoe เพื่อให้ Framework เต็มรูปแบบสำหรับปัญหาที่คล้ายกันมากมาย
    • OT.js ขึ้นอยู่กับประเภทการทำงานของ ShareJs
    • DriveSDK. API ที่น่าสนใจมากที่สามารถทำสิ่งต่างๆได้มากมายเช่นการทำงานร่วมกันบนกราฟ
    • SwellRT เป็นส้อมของ Apache Wave เป็นแบบรวมและสนับสนุน Rich Text
  • การซิงโครไนซ์ที่แตกต่างกัน:

    • Diff-Match-Patch จาก Neil Fraser
    • MobWrite ใช้ประโยชน์จากอัลกอริทึม Diff-Match-Patch
  • CRDT (ประเภทข้อมูลที่จำลองแบบสับเปลี่ยน):

    • มีอัลกอริทึม CRDT ที่แตกต่างกันจำนวนมากที่อนุญาตให้ใช้งานประเภทที่ใช้ร่วมกันได้ CRDT บางตัวทำงานร่วมกับการเผยแพร่ข้อความ P2P บางส่วนใช้โมเดลไคลเอนต์เซิร์ฟเวอร์
    • Yjsช่วยให้คุณสามารถแบ่งปันประเภทข้อมูลตามอำเภอใจ (RichText, Array, Hash Maps, .. ขยายได้) การสนับสนุนแบบออฟไลน์และการสนับสนุนโปรโตคอลการสื่อสาร P2P (มีโมดูลสำหรับ XMPP, Websockets และ WebRTC)
    • ฐานข้อมูลเซิร์ฟเวอร์เซิร์ฟเวอร์SwarmJS ที่ใช้ร่วมกันพร้อมการสนับสนุนออฟไลน์ ใช้ได้ดีกับ React
    • Wootการใช้งาน Woot CRDT
    • CRDTการใช้งาน CRDT อื่น
    • Automerge

Google Drive API ใช้ OT ไม่ใช่ DS Developers.google.com/drive/realtime/conflict-resolution
Mathias Bak




4

วิธีแก้ปัญหาแบบครบวงจรหรือ "ลากแล้วปล่อย" สำหรับปัญหานี้ไม่มีอยู่จริงเนื่องจากความซับซ้อนของการซิงโครไนซ์สถานะที่ไม่สามารถใช้ร่วมกันได้อย่างน่าเชื่อถือ คำตอบของ dmonad เป็นบทสรุปที่ดีและฉันโพสต์ภาพรวมที่เป็นปัจจุบันมากขึ้นของโซลูชันที่มีอยู่ที่นี่ที่นี่

คำถามนี้ค่อนข้างเก่า แต่Convergence (ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้ก่อตั้ง) นำเสนอโซลูชันแบบครบวงจรที่สุดไม่เพียง แต่ให้การซิงโครไนซ์ข้อมูลเท่านั้น แต่ยังมีโฮสต์ของ API อื่น ๆ ที่มีประโยชน์สำหรับการสร้าง UX ที่ทำงานร่วมกัน นี่คือตัวอย่างที่แสดงสิ่งที่คุณร้องขอ: การซิงโครไนซ์ฟิลด์ข้อความในไคลเอนต์หลายตัว

มิฉะนั้นShareDBเป็นโซลูชันโอเพ่นซอร์สที่ยอดเยี่ยมที่เหมาะกับความต้องการของผู้คนจำนวนมาก



2

ด้วย js ไคลเอนต์ lib (Strophe.js) คุณสามารถใช้เซิร์ฟเวอร์ XMPP ฟรี (เช่น jabber.org) ร่วมกับ OT lib (JSOTTEST) ฝั่งไคลเอ็นต์ของฉันเพื่อสร้างระบบไคลเอนต์เซิร์ฟเวอร์ที่สมบูรณ์

ฉันจะส่ง src ของระบบแชทไคลเอนต์เซิร์ฟเวอร์สาธิตเมื่อฉันมีเวลาแก้ไขโค้ด


1
เกือบสองปีที่แล้วคุณเขียนว่า "ฉันจะส่ง src ของการสาธิต ... " คุณเคยจบการสาธิตหรือไม่?
Bryan Oakley

ขอโทษ ... แต่ฉันไม่มีเวลาปล่อยตัวอย่างต่อสาธารณะ! อย่างไรก็ตามมันง่ายมากโดยใช้ Bosh lib สำหรับ php !! ลาก่อน
user981836

2

Npm มีไลบรารี ot ที่ดีสำหรับ node.js:

  • https://npmjs.org/package/ot - อะแดปเตอร์สำหรับ codemirror และ ace ในตัวตลอดจนการใช้งานไคลเอนต์และเซิร์ฟเวอร์
  • https://npmjs.org/package/changesets - ไลบรารี ot ธรรมดาที่ใช้งานได้ในโหนดและเบราว์เซอร์ ช่วยให้คุณสร้าง 'ชุดการเปลี่ยนแปลง' (โดยพื้นฐานแล้วแตกต่างกัน) ที่คุณสามารถส่งไปรอบ ๆ แปลงร่างซึ่งกันและกันและนำไปใช้กับเอกสาร

1

คุณสามารถพูดคุยกับคนที่Cedanet แม้ว่า Ceda จะเป็นแบบปิดและไม่มีการทดลองใช้ฟรีบนเว็บไซต์ของพวกเขา ฉันมีส่วนร่วมในการพัฒนา Ceda และยังคงทำงานร่วมกับมันในโครงการเชิงพาณิชย์ดังนั้นฉันอาจให้คำติชม / คำแนะนำได้หากคุณมุ่งหน้าไปตามเส้นทางนี้


1

ฉันคิดว่า etherpad.org กับ etherpad lite นั้นเหนือกว่าโซลูชันอื่น ๆ


1
คุณจะสามารถพิสูจน์ความเหนือกว่าของ etherpad ด้วยตัวอย่างได้หรือไม่?
DL Narasimhan

1

เรากำลังสร้างตัวแก้ไขการทำงานร่วมกันที่รวมการเปลี่ยนแปลงเชิงปฏิบัติการกับการกำหนดเวอร์ชัน ด้วยวิธีนี้เราสามารถรองรับการทำงานร่วมกันทั้งออฟไลน์และออนไลน์ เราเปิดตัวห้องสมุด OT ของเราเองเมื่อวานนี้ซึ่งเป็นส่วนหนึ่งของกลุ่มโอเพนซอร์สของเรา

http://interior.substance.io/modules/operator.html

นอกจากนี้เรายังได้สนับสนุนห้องสมุดสำหรับการกำหนดเวอร์ชัน

http://interior.substance.io/modules/chronicle.html


1

ฉันได้เขียนไลบรารี unixy ขนาดเล็ก (ทำสิ่งหนึ่งและทำได้ดี) ที่ใช้เลเยอร์ควบคุม OT ทำให้คุณสามารถเสียบ OT ประเภทต่างๆได้ (รองรับทุกประเภทที่เข้ากันได้กับ shareJS) คล้ายกับ shareJS แต่มีความคิดเห็นน้อยกว่าและเป็นนามธรรมมากกว่า

https://github.com/marcelklehr/gulf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.