คุณจะจัดการกับผู้ใช้หลายคนในการแก้ไขข้อมูลชิ้นเดียวกันใน webapp ได้อย่างไร?


26

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

ฉันกำลังพยายามที่จะออกรายละเอียดของโครงการออกมาจากสิ่งนี้ในขณะที่ฉันกำลังดิ้นรนมากขึ้นด้วยแนวคิดโดยรวมของวิธีการจัดการกับสถานการณ์ต่อไปนี้ แต่ถ้ามันช่วยฉันใช้ Java, EclipseLink และ GWT กับ RequestFactory ฐานข้อมูลคือ PostgreSQL

ดังนั้นปัญหาเกี่ยวกับความคิดที่ฉันพยายามจะกระทบยอดคือ:

  1. หากงานเดียวที่เกิดขึ้นกับผู้ใช้หลายคนเปลี่ยนแปลงในทางใด ๆ เช่นงานที่ทำเสร็จแล้วถูกลบ ฯลฯ รายการงานของผู้ใช้ทั้งหมดที่มีงานนี้จะได้รับการอัปเดต รูปแบบการออกแบบใดที่ช่วยในการนำฟังก์ชั่นนี้ไปใช้?

    • รูปแบบบางอย่างที่ฉันดูเป็นผู้สังเกตการณ์และผู้ไกล่เกลี่ย - มีรูปแบบอื่น ๆ ที่ควรพิจารณาในสิ่งเหล่านี้หรือไม่?
  2. สมมติว่ามีผู้ใช้สองคนเปลี่ยนงานเดียวกันในเวลาเดียวกัน

    • ก่อนอื่นฉันควรอนุญาตให้สถานการณ์นั้นเกิดขึ้นหรือฉันควรล็อคไว้จนกว่าจะมีคนหนึ่งหรืออีกคนหนึ่งทำการเปลี่ยนแปลง?

    • ประการที่สองถ้าฉันไม่ใส่กุญแจฉันจะกระทบยอดการเปลี่ยนแปลงที่จะยอมรับได้อย่างไร สิ่งนี้เกี่ยวข้องกับสถานการณ์ใน 1 เนื่องจากผู้ใช้ 1 สามารถส่งข้อมูลและก่อนที่ผู้ใช้ 2 จะได้รับข้อมูลที่อัปเดตเขา / เธออาจดำเนินการต่อไปและส่งการเปลี่ยนแปลงของเขา / เธอ

ฉันกำลังมองหาจุดชี้แนะคำแนะนำหรือเคล็ดลับใด ๆ ที่คุณสามารถให้ในการซิงค์ข้อมูลระหว่างอินสแตนซ์ต่าง ๆ ของเว็บแอพนี้อย่างถูกต้อง ฉันจะขอบคุณมันมาก!

คำตอบ:


17

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

สำหรับ # 2 คุณจะต้องดูที่ล็อคในแง่ดี โดยทั่วไปคุณจะต้องบันทึกเวลาบันทึกที่แก้ไขได้ทั้งหมดของคุณด้วยเวลาอัปเดตล่าสุด เมื่อคุณพยายามบันทึกระเบียนคุณต้องตรวจสอบก่อนว่าระเบียนในฐานข้อมูลมีการประทับเวลาที่อัปเดตล่าสุดเช่นเดียวกับบันทึกของคุณ หากไม่แสดงว่ามีใครบางคนอัปเดตบันทึกและตอนนี้คุณต้องได้รับบันทึกที่อัปเดตแล้วแจ้งให้ผู้ใช้ทราบว่าพวกเขาต้องป้อนการเปลี่ยนแปลงอีกครั้งหรือคุณสามารถลองรวมการเปลี่ยนแปลงของผู้ใช้เข้ากับบันทึกที่อัปเดต เป็นได้ทั้งง่ายหรือเป็นไปไม่ได้)


7

ฉันมาพร้อมกับการออกแบบสำหรับแอปพลิเคชันเดสก์ท็อป (ที่ยังไม่ได้ทดสอบอย่างสมบูรณ์) พร้อมกับข้อกำหนดที่คล้ายกันซึ่งอาจเป็นประโยชน์

วิธีแก้ปัญหาของฉันคือใช้รูปแบบMVC (มีรูปแบบเดียว แต่มีหลายตัวควบคุมและมุมมอง) ที่แต่ละตัวควบคุมทำการเปลี่ยนแปลงรูปแบบโดยใช้ธุรกรรม (โดยใช้STM ) และเมื่อมีการทำธุรกรรมรูปแบบออกอากาศการแจ้งเตือนการอัพเดทไปยังมุมมอง )

ลูกค้าแต่ละรายต่างก็คอยติดตามสิ่งที่กำลังอัปเดตอยู่ภายในเครื่อง แต่เมื่อการอัปเดตภายในเครื่องนั้นเสร็จสิ้น (เช่นส่งไปที่จะส่งมอบ) ลูกค้าจะกลับไปใช้ข้อมูลของรุ่นต้นแบบ

ฉันยังมีการเลิกทำกองซ้อนกับการเปลี่ยนแปลงทั้งหมดที่ผู้ใช้ทำเพื่อให้สิ่งต่าง ๆ สามารถเปลี่ยนกลับได้

นี่อาจไม่ใช่โมเดลที่ดีที่สุดสำหรับเว็บแอปเนื่องจากโมเดลต้องเผยแพร่การเปลี่ยนแปลงกับ Views ซึ่งอาจไม่ใช่เว็บไคลเอ็นต์ที่ง่ายที่สุด


4

สำหรับ 1. คุณควรดูว่ารูปแบบการเผยแพร่ / สมัครสมาชิกนั้นเหมาะสมกว่าหรือไม่
สำหรับ 2. มันขึ้นอยู่กับสถานการณ์ของคุณ:

  • สถานการณ์นี้จะบ่อยแค่ไหน?
  • สถานการณ์เลวร้ายเพียงใดที่ผู้ใช้ของคุณจะไม่สามารถอัปเดตงานได้เนื่องจากถูกล็อคหรือมีคนอื่นเปลี่ยนงานในระหว่างนี้
    ส่วนตัวฉันชอบวิธีการ (ใช้เช่นในpivotaltracker ) ซึ่งมี:
    • ไม่มีล็อค
    • คุณเห็นการเปลี่ยนแปลงทั้งหมดแบบเรียลไทม์และ
    • UI เชิญให้ทำการอัปเดตเล็กน้อยบ่อยครั้งแทนการอัปเดตที่ใหญ่กว่าในหลาย ๆ แอตทริบิวต์
    • คุณเก็บประวัติการเปลี่ยนแปลงทั้งหมดที่ทำไว้ หากผู้ใช้เห็นประวัติผู้ใช้ในที่สุดความขัดแย้งหรือการเขียนทับที่เกิดขึ้นในที่สุดจะสามารถแก้ไขได้ด้วยความคิดเห็นคำอธิบายประกอบหรือข้อความ

คำถามนั้นเป็นเรื่องทางวิชาการมากกว่าดังนั้นฉันจะบอกว่าบ่อยครั้งมากที่จะดูว่ามันได้รับการดูแลอย่างไรในกรณีที่เลวร้ายที่สุด +1 สำหรับการอ้างอิงรูปแบบ
hulkmeister

@ kr1 pivotaltracker ไม่มีคำเตือนความขัดแย้งและไม่รวมการเปลี่ยนแปลงที่ไม่ขัดแย้งกันดังนั้นจึงไม่ควรใช้เป็นตัวอย่างที่ดีของแอปพลิเคชันการแก้ไขบันทึกที่ดี
Eduardo

0
  • ล็อคบันทึก ไม่แนะนำให้ทำเช่นนี้เพราะจะลดการเกิดพร้อมกันและบันทึกอาจถูกล็อคไว้นานกว่าที่ต้องการ
  • สุดท้ายที่จะส่งเขียนทับการเปลี่ยนแปลงที่เกิดขึ้นพร้อมกันอื่น ๆ ผู้ใช้ไม่ต้องการสิ่งนี้ ซอฟต์แวร์บางอย่างเช่น JIRA ทำสิ่งนี้ https://community.atlassian.com/t5/Jira-questions/Edit-a-JIRA-Issue-at-the-same-time-by-two-Users-result-in-last/qaq-p/389243
  • การแก้ไขพร้อมกัน แอปพลิเคชันควรส่งเฉพาะฟิลด์ของระเบียนที่มีการเปลี่ยนแปลง ด้วยวิธีนี้คุณจะป้องกันความขัดแย้ง ซอฟต์แวร์วิกิส่วนใหญ่สามารถรวมการเปลี่ยนแปลงในฟิลด์ข้อความเดียวกันได้หากไม่มีข้อขัดแย้ง: /programming/3411888/how-does-a-wiki-handle-multiple-sim พร้อมกัน ตัวอย่างเช่น MediaWiki อนุญาตให้แก้ไขพร้อมกันและมี UI ที่ดีในกรณีที่มีข้อขัดแย้ง: https://www.mediawiki.org/wiki/Extension:TwoColConflict

คำแนะนำของฉันคืออย่าล็อคและรายงานข้อขัดแย้งหากเกิดขึ้น

โปรดดูที่:

https://github.com/spring-projects/spring-petclinic/issues/433

คุณสามารถดูวิดีโอและรหัสตัวอย่าง

สิ่งนั้นจะตอบสนองความต้องการของคุณหรือไม่

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