การทำงานของ idempotent คืออะไร
การทำงานของ idempotent คืออะไร
คำตอบ:
ในการคำนวณการดำเนินการ idempotent เป็นสิ่งที่ไม่มีผลเพิ่มเติมหากถูกเรียกมากกว่าหนึ่งครั้งด้วยพารามิเตอร์อินพุตเดียวกัน ตัวอย่างเช่นการลบไอเท็มออกจากชุดถือเป็นการดำเนินการ idempotent ในชุด
ในทางคณิตศาสตร์การดำเนิน idempotent เป็นหนึ่งที่f (f (x)) = f (x) ยกตัวอย่างเช่นabs()
ฟังก์ชั่น idempotent เพราะทั้งหมดabs(abs(x)) = abs(x)
x
นิยามที่แตกต่างกันเล็กน้อยเหล่านี้สามารถกระทบยอดได้โดยพิจารณาว่าxในนิยามทางคณิตศาสตร์หมายถึงสถานะของวัตถุและfคือการดำเนินการที่อาจกลายพันธุ์วัตถุนั้น ตัวอย่างเช่นพิจารณาPythonset
และdiscard
วิธีการ discard
วิธีการเอาองค์ประกอบจากชุดและไม่ทำอะไรเลยถ้าองค์ประกอบไม่อยู่ ดังนั้น:
my_set.discard(x)
มีผลเหมือนกับการดำเนินการเดียวกันสองครั้ง:
my_set.discard(x)
my_set.discard(x)
การดำเนินการ Idempotent มักใช้ในการออกแบบโปรโตคอลเครือข่ายซึ่งรับประกันว่าจะมีการร้องขอให้ดำเนินการอย่างน้อยหนึ่งครั้ง แต่อาจเกิดขึ้นได้มากกว่าหนึ่งครั้ง หากการดำเนินการเป็น idempotent แสดงว่าไม่มีอันตรายใด ๆ ในการดำเนินการสองครั้งขึ้นไป
ดูบทความ Wikipedia เกี่ยวกับidempotenceสำหรับข้อมูลเพิ่มเติม
คำตอบข้างต้นก่อนหน้านี้มีตัวอย่างที่ไม่ถูกต้องและทำให้เข้าใจผิด ความคิดเห็นด้านล่างเขียนก่อนเมษายน 2014 หมายถึงการแก้ไขที่เก่ากว่า
set
ตัวอย่างเช่นในคำตอบของวัตถุที่ตั้งไว้อย่างชัดเจนมีสถานะและยังมีการดำเนินงาน idempotent discard
บางอย่างเช่น
discard
ดังนั้นคุณสามารถทำได้discard([my_set, x]) = [my_new_set, x]
discard(discard([my_set, x]))
โปรดทราบว่า[my_new_set, x]
เป็นเพียงหนึ่งอาร์กิวเมนต์และประเภทของมันคือ 2-tuple
discard(x)
เป็นครั้งที่สองจะมีผลเช่นเดียวกับเรียกมันว่าเป็นครั้งแรก: x
ชุดจะไม่ประกอบด้วย การคำนวณ idempotenceนั้นเกี่ยวกับความทนทานของระบบ เนื่องจากสิ่งต่าง ๆ สามารถล้มเหลว (เช่นเครือข่ายดับ), เมื่อตรวจพบความล้มเหลวคุณจะกู้คืนได้อย่างไร? การกู้คืนที่ง่ายที่สุดคือการทำมันอีกครั้ง แต่วิธีนี้ใช้ได้ผลถ้าทำอีกครั้งคือ idempotent เช่นdiscard(x)
idempotent แต่pop()
ไม่ใช่ มันคือทั้งหมดที่เกี่ยวกับการกู้คืนข้อผิดพลาด
การดำเนินการ idempotent สามารถทำซ้ำได้หลายครั้งโดยพลการและผลลัพธ์จะเหมือนกับว่าได้ทำเพียงครั้งเดียว ในเลขคณิตการเพิ่มศูนย์ให้กับตัวเลขคือ idempotent
Idempotence ได้รับการพูดคุยกันมากมายเกี่ยวกับบริการเว็บ "สงบ" ส่วนที่เหลือพยายามที่จะใช้ประโยชน์สูงสุดจาก HTTP เพื่อให้โปรแกรมเข้าถึงเนื้อหาเว็บและโดยทั่วไปจะถูกตั้งค่าในทางตรงกันข้ามกับบริการบนเว็บที่ใช้ SOAP ซึ่งเป็นเพียงแค่รูปแบบการเรียกโพรซีเดอร์แบบรีโมตช่องสัญญาณภายในการร้องขอและการตอบกลับ HTTP
REST จัดระเบียบเว็บแอปพลิเคชันเป็น "ทรัพยากร" (เช่นผู้ใช้ Twitter หรือรูปภาพ Flickr) จากนั้นใช้คำกริยา HTTP ของ POST, PUT, GET และ DELETE เพื่อสร้างอัปเดตอ่านและลบทรัพยากรเหล่านั้น
Idempotence มีบทบาทสำคัญใน REST หากคุณได้รับการนำเสนอทรัพยากร REST (เช่นรับภาพ jpeg จาก Flickr) และการดำเนินการล้มเหลวคุณสามารถทำซ้ำ GET ซ้ำแล้วซ้ำอีกจนกว่าการดำเนินการจะสำเร็จ สำหรับบริการบนเว็บไม่สำคัญว่าภาพจะได้รับกี่ครั้ง ในทำนองเดียวกันหากคุณใช้บริการเว็บสงบเพื่ออัปเดตข้อมูลบัญชี Twitter ของคุณคุณสามารถใส่ข้อมูลใหม่ได้หลายครั้งเพื่อรับการยืนยันจากบริการเว็บ PUT-ing หนึ่งพันครั้งก็เหมือนกับ PUT-ing เพียงครั้งเดียว ในทำนองเดียวกันการลบทรัพยากร REST หนึ่งพันครั้งก็เหมือนกับการลบครั้งเดียว Idempotence ทำให้การสร้างบริการบนเว็บนั้นง่ายขึ้นมากสำหรับข้อผิดพลาดในการสื่อสาร
อ่านเพิ่มเติม: สงบ Web Servicesโดยริชาร์ดและทับทิม (idempotence จะกล่าวถึงในหน้า 103-104) และรอยฟีลดิงของวิทยานิพนธ์ปริญญาเอกในส่วนที่เหลือ ฟีลดิงเป็นหนึ่งในผู้เขียนของ HTTP 1.1, RFC-2616 ซึ่งพูดถึงเกี่ยวกับ idempotence ในส่วน 9.1.2
ไม่ว่าคุณจะเรียกใช้การดำเนินการกี่ครั้งผลลัพธ์ก็จะเหมือนเดิม
truncate
delete
Idempotence หมายถึงการใช้งานเพียงครั้งเดียวหรือใช้หลายครั้งก็มีผลเหมือนกัน
ตัวอย่าง:
สำหรับฟังก์ชั่นแท้ (ฟังก์ชั่นที่ไม่มีผลข้างเคียง) idempotency ก็หมายความว่า f (x) = f (f (x)) = f (f (f (x (x)))) = f (f (f (f (x))) ) = ...... สำหรับค่าทั้งหมดของ x
สำหรับฟังก์ชั่นที่มีผลข้างเคียง idempotency ยิ่งกว่านั้นก็หมายความว่าจะไม่มีผลข้างเคียงเพิ่มเติมเกิดขึ้นหลังจากการใช้ครั้งแรก คุณสามารถพิจารณาสถานะของโลกที่จะเป็นพารามิเตอร์ "ซ่อน" เพิ่มเติมในฟังก์ชั่นหากคุณต้องการ
โปรดทราบว่าในโลกที่คุณมีการดำเนินการเกิดขึ้นพร้อมกันคุณอาจพบว่าการดำเนินการที่คุณคิดว่า idempotent หยุดเป็นเช่นนั้น (ตัวอย่างเช่นเธรดอื่นสามารถยกเลิกการตั้งค่าค่าสถานะบูลีนในตัวอย่างด้านบน) โดยทั่วไปเมื่อใดก็ตามที่คุณมีภาวะพร้อมกันและรัฐที่ไม่แน่นอนคุณต้องคิดอย่างรอบคอบมากขึ้นเกี่ยวกับ idempotency
Idempotency มักจะเป็นคุณสมบัติที่มีประโยชน์ในการสร้างระบบที่แข็งแกร่ง ตัวอย่างเช่นหากมีความเสี่ยงที่คุณอาจได้รับข้อความซ้ำซ้อนจากบุคคลที่สามมันจะเป็นประโยชน์ที่จะให้ตัวจัดการข้อความทำหน้าที่เป็น idempotent การดำเนินการเพื่อให้ผลข้อความที่เกิดขึ้นเพียงครั้งเดียว
f(x) = f(f(x))
ๆ คุณหมายถึงว่าf(x){return x+1;}
มันไม่ใช่ฟังก์ชั่นแท้หรือ เพราะf(x) != f(f(x))
: f(1)
ให้ 2 ในขณะที่f(2)
ให้ 3
f(x) = f(f(x))
หมายถึง แต่ตามที่ @GregHewgill พูดถึงเพื่อให้คำจำกัดความนี้สมเหตุสมผลคุณต้องพิจารณาx
เป็นวัตถุและf
เป็นการดำเนินการที่ทำให้สถานะของวัตถุเปลี่ยนแปลง (เช่น: ผลลัพธ์ของf
การกลายพันธุ์x
)
การดำเนินการ idempotent สร้างผลลัพธ์ในสถานะเดียวกันแม้ว่าคุณจะเรียกมันมากกว่าหนึ่งครั้งโดยที่คุณผ่านพารามิเตอร์เดียวกัน
แค่อยากจะโยนกรณีการใช้งานจริงที่แสดงให้เห็นถึง idempotence ใน JavaScript สมมติว่าคุณกำลังกำหนดคลาสโมเดลโมเดล (เช่นเดียวกับในรูปแบบ MVC) วิธีที่สิ่งนี้ถูกนำไปใช้มักจะเทียบเท่ากับสิ่งนี้ (ตัวอย่างพื้นฐาน):
function model(name) {
function Model() {
this.name = name;
}
return Model;
}
จากนั้นคุณสามารถกำหนดคลาสใหม่เช่นนี้:
var User = model('user');
var Article = model('article');
แต่ถ้าคุณพยายามที่จะให้User
ชั้นเรียนผ่านmodel('user')
จากที่อื่นในรหัสมันจะล้มเหลว:
var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');
ช่างUser
ก่อสร้างสองคนนั้นจะแตกต่างกัน นั่นคือ,
model('user') !== model('user');
ในการทำให้idempotentคุณเพียงแค่เพิ่มกลไกการแคชบางอย่างเช่นนี้:
var collection = {};
function model(name) {
if (collection[name])
return collection[name];
function Model() {
this.name = name;
}
collection[name] = Model;
return Model;
}
โดยการเพิ่มแคชทุกครั้งที่คุณทำmodel('user')
มันจะเป็นวัตถุเดียวกันและดังนั้นจึงเป็น idempotent ดังนั้น:
model('user') === model('user');
การดำเนินการ idempotent เป็นการดำเนินการการกระทำหรือคำขอที่สามารถนำมาใช้ได้หลายครั้งโดยไม่เปลี่ยนผลลัพธ์เช่นสถานะของระบบนอกเหนือจากแอปพลิเคชันเริ่มต้น
ตัวอย่าง (บริบทของเว็บแอป):
IDEMPOTENT: การสร้างคำขอที่เหมือนกันหลายรายการมีผลเช่นเดียวกับการร้องขอเดียว ข้อความในระบบส่งข้อความอีเมลถูกเปิดและทำเครื่องหมายเป็น "เปิด" ในฐานข้อมูล หนึ่งสามารถเปิดข้อความได้หลายครั้ง แต่การกระทำซ้ำ ๆ จะส่งผลให้ข้อความนั้นอยู่ในสถานะ "เปิด" นี่คือการดำเนินการ idempotent ครั้งแรกที่หนึ่งทำการอัปเดตเป็นทรัพยากรโดยใช้ข้อมูลที่ไม่ตรงกับทรัพยากร (สถานะของระบบ) สถานะของระบบจะเปลี่ยนไปเมื่อมีการอัปเดตทรัพยากร หากหนึ่ง PUTs การปรับปรุงเดียวกันเป็นทรัพยากรซ้ำแล้วข้อมูลในการปรับปรุงจะตรงกับข้อมูลที่อยู่ในระบบแล้วในทุก ๆ PUT และไม่มีการเปลี่ยนแปลงสถานะของระบบจะเกิดขึ้น PUTs ซ้ำที่มีข้อมูลเดียวกันคือ idempotent:
ไม่ใช่ IDEMPOTENT: หากการดำเนินการทำให้เกิดการเปลี่ยนแปลงในสถานะเช่นโพสต์ข้อความเดียวกันให้กับผู้ใช้ซ้ำแล้วซ้ำอีกส่งผลให้ข้อความใหม่ส่งและเก็บไว้ในฐานข้อมูลทุกครั้งที่เราบอกว่าการดำเนินการไม่ใช่ IDEMPOTENT
NULLIPOTENT: หากการดำเนินการไม่มีผลข้างเคียงเช่นการแสดงข้อมูลบนหน้าเว็บโดยไม่มีการเปลี่ยนแปลงใด ๆ ในฐานข้อมูล (ในคำอื่น ๆ ที่คุณกำลังอ่านฐานข้อมูลเท่านั้น) เราพูดว่าการดำเนินการเป็น NULLIPOTENT GET ทั้งหมดควรเป็นโมฆะ
เมื่อพูดถึงสถานะของระบบเราจะมองข้ามผลที่ไม่เป็นอันตรายและไม่สามารถหลีกเลี่ยงได้เช่นการบันทึกและการวินิจฉัย
Idempotent Operations:การดำเนินการที่ไม่มีผลข้างเคียงหากดำเนินการหลายครั้ง
ตัวอย่าง : การดำเนินการที่ดึงค่าจากแหล่งข้อมูลและพูดพิมพ์
ปฏิบัติการที่ไม่ใช่ Idempotent:การดำเนินการที่อาจก่อให้เกิดอันตรายหากดำเนินการหลายครั้ง (ในขณะที่พวกเขาเปลี่ยนค่าหรือบางรัฐ)
ตัวอย่าง:การดำเนินการที่ถอนออกจากบัญชีธนาคาร
ค่อนข้างคำตอบรายละเอียดและทางเทคนิค เพียงแค่เพิ่มคำจำกัดความง่ายๆ
Idempotent = เรียกใช้ซ้ำได้
ตัวอย่างเช่น
Create
การดำเนินการในตัวเองไม่รับประกันว่าจะทำงานโดยไม่มีข้อผิดพลาดหากดำเนินการมากกว่าหนึ่งครั้ง แต่ถ้ามีการดำเนินการCreateOrUpdate
ก็จะเรียกใช้อีกครั้ง (Idempotency)
การดำเนินการ idempotent เหนือชุดทำให้สมาชิกไม่เปลี่ยนแปลงเมื่อใช้อย่างน้อยหนึ่งครั้ง
มันอาจเป็นการดำเนินการที่เป็นเอกภาพอย่างสัมบูรณ์ (x)โดยที่ x เป็นของชุดจำนวนเต็มบวก นี่คือสัมบูรณ์ (สัมบูรณ์ (x)) = x
มันสามารถเป็นการดำเนินการแบบไบนารีเช่นสหภาพของชุดกับตัวเองมักจะส่งกลับชุดเดียวกัน
ไชโย
เป็นการดำเนินการใด ๆ ที่ทุกผลลัพธ์ที่ n จะส่งผลให้ผลลัพธ์ที่ตรงกับค่าของผลลัพธ์ที่ 1 ยกตัวอย่างเช่นค่าสัมบูรณ์ของ -1 คือ 1 ค่าสัมบูรณ์ของค่าสัมบูรณ์ของ -1 คือ 1 ค่าสัมบูรณ์ของค่าสัมบูรณ์ของค่าสัมบูรณ์ของ -1 คือ 1 และอื่น ๆ
ดูเพิ่มเติม: เมื่อไหร่จะเป็นเวลาที่โง่มากที่จะใช้การเรียกซ้ำ?
ตัวอย่างที่ดีในการทำความเข้าใจการทำงานของ idempotent อาจเป็นการล็อครถด้วยกุญแจรีโมท
log(Car.state) // unlocked
Remote.lock();
log(Car.state) // locked
Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked
lock
เป็นการดำเนินการ idempotent แม้ว่าจะมีผลข้างเคียงบ้างในแต่ละครั้งที่คุณวิ่งlock
เช่นกะพริบรถยังคงอยู่ในสถานะล็อคเดียวกันไม่ว่าคุณจะทำการล็อคกี่ครั้งก็ตาม
5c ของฉัน: ในการบูรณาการและการสร้างเครือข่าย idempotency นั้นสำคัญมาก ตัวอย่างจากชีวิตจริง: ลองนึกภาพเราส่งข้อมูลไปยังระบบเป้าหมาย ส่งข้อมูลตามลำดับข้อความ 1. จะเกิดอะไรขึ้นถ้าลำดับผสมกันในช่อง (ตามที่แพ็กเกจเครือข่ายทำเสมอ :)) หากระบบเป้าหมายเป็น idempotent ผลลัพธ์จะไม่แตกต่างกัน หากระบบเป้าหมายขึ้นอยู่กับลำดับที่ถูกต้องในลำดับเราต้องดำเนินการ resequencer บนไซต์เป้าหมายซึ่งจะเรียกคืนลำดับที่ถูกต้อง 2. จะเกิดอะไรขึ้นหากมีข้อความซ้ำกัน หากช่องสัญญาณของระบบเป้าหมายไม่ตอบสนองทันเวลาระบบต้นทาง (หรือช่องสัญญาณเอง) มักจะส่งสำเนาข้อความอีกชุด ดังนั้นเราสามารถมีข้อความซ้ำกันในด้านระบบเป้าหมาย หากระบบเป้าหมายเป็น idempotent มันจะดูแลมันและผลลัพธ์จะไม่แตกต่างกัน หากระบบเป้าหมายไม่ใช่ idempotent เราต้องติดตั้ง deduplicator ทางด้านระบบเป้าหมายของช่อง
กล่าวโดยย่อการปฏิบัติการ Idempotent หมายความว่าการดำเนินการจะไม่ส่งผลให้เกิดผลลัพธ์ที่แตกต่างกันไม่ว่าคุณจะใช้งานการดำเนินการ idempotent กี่ครั้งก็ตาม
ตัวอย่างเช่นตามข้อกำหนดของข้อมูลจำเพาะของ HTTP GET, HEAD, PUT, and DELETE
คือการดำเนินการ idempotent อย่างไรก็ตามPOST and PATCH
ไม่ใช่ นั่นเป็นเหตุผลที่บางครั้งจะถูกแทนที่ด้วยPOST
PUT
ลองใหม่อีกครั้งปลอดภัย
มักเป็นวิธีที่ง่ายที่สุดในการเข้าใจความหมายในสาขาวิทยาศาสตร์คอมพิวเตอร์
Idempotent operations are often used in the design of network protocols
นี่เป็นตัวอย่างที่เกี่ยวข้อง ** GET ไม่ควรเปลี่ยนแปลงอะไรบนเซิร์ฟเวอร์ดังนั้น GET จึงเป็น idempotent ในบริบท HTTP / servlet หมายถึงคำขอเดียวกันสามารถทำได้สองครั้งโดยไม่มีผลกระทบด้านลบ ** POST ไม่ใช่ idempotent