การทำงานของ idempotent คืออะไร


คำตอบ:


964

ในการคำนวณการดำเนินการ 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 หมายถึงการแก้ไขที่เก่ากว่า


6
ตัวอย่าง: เนื่องจากคำตอบข้างต้นระบุว่าIdempotent operations are often used in the design of network protocolsนี่เป็นตัวอย่างที่เกี่ยวข้อง ** GET ไม่ควรเปลี่ยนแปลงอะไรบนเซิร์ฟเวอร์ดังนั้น GET จึงเป็น idempotent ในบริบท HTTP / servlet หมายถึงคำขอเดียวกันสามารถทำได้สองครั้งโดยไม่มีผลกระทบด้านลบ ** POST ไม่ใช่ idempotent
KNU

1
"ไร้สัญชาติ" ตรงกันกับ "idempotent" หรือไม่?
Michael Osofsky

2
@MichaelOsofsky: ไม่มีในหลามsetตัวอย่างเช่นในคำตอบของวัตถุที่ตั้งไว้อย่างชัดเจนมีสถานะและยังมีการดำเนินงาน idempotent discardบางอย่างเช่น
Greg Hewgill

1
@MichaelOsofsky, นอกจากนี้ยังสามารถนำมาใช้ในทางที่ไร้สัญชาติโดยครอบคลุมรัฐในมูลค่าสิ่งตอบแทน:discard ดังนั้นคุณสามารถทำได้discard([my_set, x]) = [my_new_set, x] discard(discard([my_set, x]))โปรดทราบว่า[my_new_set, x]เป็นเพียงหนึ่งอาร์กิวเมนต์และประเภทของมันคือ 2-tuple
Pacerier

2
@Green เมื่อใช้ในระยะผลเช่นเดียวกันในบริบทของความอ่อนแอก็หมายความว่าผลจะเหมือนกันไม่ได้ดำเนินการ โทรdiscard(x)เป็นครั้งที่สองจะมีผลเช่นเดียวกับเรียกมันว่าเป็นครั้งแรก: xชุดจะไม่ประกอบด้วย การคำนวณ idempotenceนั้นเกี่ยวกับความทนทานของระบบ เนื่องจากสิ่งต่าง ๆ สามารถล้มเหลว (เช่นเครือข่ายดับ), เมื่อตรวจพบความล้มเหลวคุณจะกู้คืนได้อย่างไร? การกู้คืนที่ง่ายที่สุดคือการทำมันอีกครั้ง แต่วิธีนี้ใช้ได้ผลถ้าทำอีกครั้งคือ idempotent เช่นdiscard(x)idempotent แต่pop()ไม่ใช่ มันคือทั้งหมดที่เกี่ยวกับการกู้คืนข้อผิดพลาด
Andreas

138

การดำเนินการ 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


ชัดเจนและตรงไปตรงมา ยังเป็นแต่เพียงหนึ่งในการตีความของ idempotent
Pacerier

10
"idempotence" เป็นคำที่ใช้บ่อยมากเพราะฟังดูโอ้อวดและมีตัวอักษรมากพอที่จะผ่านการตรวจสอบ sesquipedalian หาก Benjamin Peirceเลือกคำที่ฟังง่ายกว่านี้เราคงไม่มีคำถามในวันนี้
Pacerier

2
จะเข้าใจได้อย่างไร: การลบทรัพยากร REST ในทำนองเดียวกันการลบพันครั้งเหมือนกับการลบครั้งเดียว ? คุณไม่สามารถลบทรัพยากรได้อีกหากถูกลบไปแล้ว
กรีน

1
@Green แต่คุณจะไม่ลบมันในครั้งแรก คุณส่งคำขอลบ จุดสำคัญคือคุณสามารถส่งคำขอได้มากเท่าที่คุณต้องการ
Caleth

1
@JimFerrans ฉันเห็น ฉันคิดว่าอาจมีเหตุผลบางอย่างที่เกี่ยวข้องกับฟังก์ชั่น (อยู่ภายในตัว HTTP) ว่าทำไม PUT สามารถส่งใหม่ได้โดยไม่ต้องกังวลขณะที่ POST ไม่ ตอนนี้ดูเหมือนว่าเราต้องการเพียงเพื่อให้เป็นไปตามมาตรฐาน HTTP และพฤติกรรมทั้งหมดขึ้นอยู่กับวิธีการใช้งานเซิร์ฟเวอร์
mangusta

109

ไม่ว่าคุณจะเรียกใช้การดำเนินการกี่ครั้งผลลัพธ์ก็จะเหมือนเดิม


8
ฉันได้ยิน idempotent ถูกนิยามว่าเป็นอย่างใดอย่างหนึ่งหรือทั้งสองอย่างจากด้านล่าง: 1) สำหรับชุดอินพุตที่กำหนดมันจะส่งคืนผลลัพธ์เดียวกันเสมอ 2) ไม่สร้างผลข้างเคียงใด ๆ คำถามของฉันคือถ้าฟังก์ชั่นเป็นไปตาม # 1 แต่ไม่ใช่ # 2 เพราะมันส่งผลให้เกิดผลข้างเคียงที่ไม่เกี่ยวข้องกับการคำนวณ (เช่นบันทึกการร้องขอไปยังแหล่งข้อมูล) มันยังถือว่าเป็น idempotent หรือไม่?
Keith Bennett

12
ผลลัพธ์ของการเรียกการดำเนินการจะต้องรวมถึงสถานะของระบบดังนั้นหากการดำเนินการมีผลข้างเคียงสะสมบางอย่างมันไม่ได้เป็น idempotent อย่างไรก็ตามหากผลข้างเคียงออกจากระบบในสถานะเดียวกันไม่ว่าจะมีการเรียกใช้การดำเนินการกี่ครั้งมันก็อาจจะเป็น idempotent
Robert

4
สั้นและหวานฉันรักคำตอบแบบนั้น ไม่แน่ใจว่าทำไมฉันต้องค้นหาคำนี้ตลอดเวลามันเป็นคำที่ไม่อยู่กับฉัน
Prancer

1
@ KeithBennett คำจำกัดความที่สองผิด "ไม่มีผลข้างเคียง" ไม่ได้หมายความว่า idempotent ฟังก์ชั่น Idempotent สามารถมีผลข้างเคียง เช่นของ MySQL และtruncate delete
Pacerier

ผลลัพธ์จะเหมือนกัน (นั่นคือสถานะของระบบ) แต่การตอบสนองอาจแตกต่างกัน (เช่นรหัสสถานะ HTTP ในบริการ REST)
G. Steigert

50

Idempotence หมายถึงการใช้งานเพียงครั้งเดียวหรือใช้หลายครั้งก็มีผลเหมือนกัน

ตัวอย่าง:

  • คูณด้วยศูนย์ ไม่ว่าคุณจะทำกี่ครั้งผลลัพธ์ก็ยังคงเป็นศูนย์
  • การตั้งค่าสถานะบูลีน ไม่ว่าคุณจะทำกี่ครั้งก็ตามการตั้งค่าสถานะจะยังคงอยู่
  • การลบแถวออกจากฐานข้อมูลด้วย ID ที่กำหนด หากคุณลองอีกครั้งแถวจะหายไป

สำหรับฟังก์ชั่นแท้ (ฟังก์ชั่นที่ไม่มีผลข้างเคียง) idempotency ก็หมายความว่า f (x) = f (f (x)) = f (f (f (x (x)))) = f (f (f (f (x))) ) = ...... สำหรับค่าทั้งหมดของ x

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

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

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


1
ถ้าเป็นฟังก์ชั่นแท้f(x) = f(f(x))ๆ คุณหมายถึงว่าf(x){return x+1;}มันไม่ใช่ฟังก์ชั่นแท้หรือ เพราะf(x) != f(f(x)): f(1)ให้ 2 ในขณะที่f(2)ให้ 3
Pacerier

1
@Pacerier ไม่มี @mikera ไม่ว่าจะเป็นที่บริสุทธิ์และ idempotent f(x) = f(f(x))หมายถึง แต่ตามที่ @GregHewgill พูดถึงเพื่อให้คำจำกัดความนี้สมเหตุสมผลคุณต้องพิจารณาxเป็นวัตถุและfเป็นการดำเนินการที่ทำให้สถานะของวัตถุเปลี่ยนแปลง (เช่น: ผลลัพธ์ของfการกลายพันธุ์x)
Justin J Stark

24

การดำเนินการ idempotent สร้างผลลัพธ์ในสถานะเดียวกันแม้ว่าคุณจะเรียกมันมากกว่าหนึ่งครั้งโดยที่คุณผ่านพารามิเตอร์เดียวกัน


1
ฟังดูไม่สมเหตุสมผลเลย stackoverflow.com/questions/1077412/…
Green

2
ฉันคิดว่าคุณอาจจะทำให้เกิดความสับสนidempotentและกำหนด
Suncat2000

16

แค่อยากจะโยนกรณีการใช้งานจริงที่แสดงให้เห็นถึง 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');

10

การดำเนินการ idempotent เป็นการดำเนินการการกระทำหรือคำขอที่สามารถนำมาใช้ได้หลายครั้งโดยไม่เปลี่ยนผลลัพธ์เช่นสถานะของระบบนอกเหนือจากแอปพลิเคชันเริ่มต้น

ตัวอย่าง (บริบทของเว็บแอป):

IDEMPOTENT: การสร้างคำขอที่เหมือนกันหลายรายการมีผลเช่นเดียวกับการร้องขอเดียว ข้อความในระบบส่งข้อความอีเมลถูกเปิดและทำเครื่องหมายเป็น "เปิด" ในฐานข้อมูล หนึ่งสามารถเปิดข้อความได้หลายครั้ง แต่การกระทำซ้ำ ๆ จะส่งผลให้ข้อความนั้นอยู่ในสถานะ "เปิด" นี่คือการดำเนินการ idempotent ครั้งแรกที่หนึ่งทำการอัปเดตเป็นทรัพยากรโดยใช้ข้อมูลที่ไม่ตรงกับทรัพยากร (สถานะของระบบ) สถานะของระบบจะเปลี่ยนไปเมื่อมีการอัปเดตทรัพยากร หากหนึ่ง PUTs การปรับปรุงเดียวกันเป็นทรัพยากรซ้ำแล้วข้อมูลในการปรับปรุงจะตรงกับข้อมูลที่อยู่ในระบบแล้วในทุก ๆ PUT และไม่มีการเปลี่ยนแปลงสถานะของระบบจะเกิดขึ้น PUTs ซ้ำที่มีข้อมูลเดียวกันคือ idempotent:

ไม่ใช่ IDEMPOTENT: หากการดำเนินการทำให้เกิดการเปลี่ยนแปลงในสถานะเช่นโพสต์ข้อความเดียวกันให้กับผู้ใช้ซ้ำแล้วซ้ำอีกส่งผลให้ข้อความใหม่ส่งและเก็บไว้ในฐานข้อมูลทุกครั้งที่เราบอกว่าการดำเนินการไม่ใช่ IDEMPOTENT

NULLIPOTENT: หากการดำเนินการไม่มีผลข้างเคียงเช่นการแสดงข้อมูลบนหน้าเว็บโดยไม่มีการเปลี่ยนแปลงใด ๆ ในฐานข้อมูล (ในคำอื่น ๆ ที่คุณกำลังอ่านฐานข้อมูลเท่านั้น) เราพูดว่าการดำเนินการเป็น NULLIPOTENT GET ทั้งหมดควรเป็นโมฆะ

เมื่อพูดถึงสถานะของระบบเราจะมองข้ามผลที่ไม่เป็นอันตรายและไม่สามารถหลีกเลี่ยงได้เช่นการบันทึกและการวินิจฉัย


9

Idempotent Operations:การดำเนินการที่ไม่มีผลข้างเคียงหากดำเนินการหลายครั้ง
ตัวอย่าง : การดำเนินการที่ดึงค่าจากแหล่งข้อมูลและพูดพิมพ์

ปฏิบัติการที่ไม่ใช่ Idempotent:การดำเนินการที่อาจก่อให้เกิดอันตรายหากดำเนินการหลายครั้ง (ในขณะที่พวกเขาเปลี่ยนค่าหรือบางรัฐ)
ตัวอย่าง:การดำเนินการที่ถอนออกจากบัญชีธนาคาร


3
คำตอบที่ผิดจริง! สำหรับการดำเนินการ Idempotent ที่บอกว่า "ไม่มีผลข้างเคียง" ไม่ถูกต้อง สำหรับปฏิบัติการที่ไม่ใช่ idempotent ที่ว่า "ทำให้เกิดอันตราย" เป็นคำตอบที่สับสน
Saeed Mohtasham

9

ค่อนข้างคำตอบรายละเอียดและทางเทคนิค เพียงแค่เพิ่มคำจำกัดความง่ายๆ

Idempotent = เรียกใช้ซ้ำได้

ตัวอย่างเช่น Createการดำเนินการในตัวเองไม่รับประกันว่าจะทำงานโดยไม่มีข้อผิดพลาดหากดำเนินการมากกว่าหนึ่งครั้ง แต่ถ้ามีการดำเนินการCreateOrUpdateก็จะเรียกใช้อีกครั้ง (Idempotency)


3
นี่คือคำจำกัดความที่หลอกลวง ความสามารถในการเรียกใช้ซ้ำไม่ได้รับประกันว่าจะเป็น idempotent การดำเนินการสามารถเรียกใช้ซ้ำได้และในการเรียกใช้แต่ละครั้งสามารถเพิ่มเอฟเฟกต์เพิ่มเติมให้กับผลลัพธ์ได้ดังนั้นจึงไม่เป็น idempotent
Saeed Mohtasham

7

การดำเนินการ idempotent เหนือชุดทำให้สมาชิกไม่เปลี่ยนแปลงเมื่อใช้อย่างน้อยหนึ่งครั้ง

มันอาจเป็นการดำเนินการที่เป็นเอกภาพอย่างสัมบูรณ์ (x)โดยที่ x เป็นของชุดจำนวนเต็มบวก นี่คือสัมบูรณ์ (สัมบูรณ์ (x)) = x

มันสามารถเป็นการดำเนินการแบบไบนารีเช่นสหภาพของชุดกับตัวเองมักจะส่งกลับชุดเดียวกัน

ไชโย


การดำเนินการ idempotent เป็นที่ที่ f (f (x)) = f (x) "ปล่อยให้สมาชิกไม่เปลี่ยนแปลง" ไม่ใช่คำตอบที่ถูก
Saeed Mohtasham

7

เป็นการดำเนินการใด ๆ ที่ทุกผลลัพธ์ที่ n จะส่งผลให้ผลลัพธ์ที่ตรงกับค่าของผลลัพธ์ที่ 1 ยกตัวอย่างเช่นค่าสัมบูรณ์ของ -1 คือ 1 ค่าสัมบูรณ์ของค่าสัมบูรณ์ของ -1 คือ 1 ค่าสัมบูรณ์ของค่าสัมบูรณ์ของค่าสัมบูรณ์ของ -1 คือ 1 และอื่น ๆ

ดูเพิ่มเติม: เมื่อไหร่จะเป็นเวลาที่โง่มากที่จะใช้การเรียกซ้ำ?


1
มันเป็นคำตอบที่แหลมคมแม้หลังจาก 10 ปี +1
snr

3

ตัวอย่างที่ดีในการทำความเข้าใจการทำงานของ idempotent อาจเป็นการล็อครถด้วยกุญแจรีโมท

log(Car.state) // unlocked

Remote.lock();
log(Car.state) // locked

Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked

lockเป็นการดำเนินการ idempotent แม้ว่าจะมีผลข้างเคียงบ้างในแต่ละครั้งที่คุณวิ่งlockเช่นกะพริบรถยังคงอยู่ในสถานะล็อคเดียวกันไม่ว่าคุณจะทำการล็อคกี่ครั้งก็ตาม


1

5c ของฉัน: ในการบูรณาการและการสร้างเครือข่าย idempotency นั้นสำคัญมาก ตัวอย่างจากชีวิตจริง: ลองนึกภาพเราส่งข้อมูลไปยังระบบเป้าหมาย ส่งข้อมูลตามลำดับข้อความ 1. จะเกิดอะไรขึ้นถ้าลำดับผสมกันในช่อง (ตามที่แพ็กเกจเครือข่ายทำเสมอ :)) หากระบบเป้าหมายเป็น idempotent ผลลัพธ์จะไม่แตกต่างกัน หากระบบเป้าหมายขึ้นอยู่กับลำดับที่ถูกต้องในลำดับเราต้องดำเนินการ resequencer บนไซต์เป้าหมายซึ่งจะเรียกคืนลำดับที่ถูกต้อง 2. จะเกิดอะไรขึ้นหากมีข้อความซ้ำกัน หากช่องสัญญาณของระบบเป้าหมายไม่ตอบสนองทันเวลาระบบต้นทาง (หรือช่องสัญญาณเอง) มักจะส่งสำเนาข้อความอีกชุด ดังนั้นเราสามารถมีข้อความซ้ำกันในด้านระบบเป้าหมาย หากระบบเป้าหมายเป็น idempotent มันจะดูแลมันและผลลัพธ์จะไม่แตกต่างกัน หากระบบเป้าหมายไม่ใช่ idempotent เราต้องติดตั้ง deduplicator ทางด้านระบบเป้าหมายของช่อง


Idempotency ของคำร้องขอเดี่ยวที่ส่งแยกจากคำร้องขออื่นใด (หรือสิ่งอื่นใดที่เกิดขึ้นที่เปลี่ยนแปลงสถานะของระบบ) ไม่เหมือนกับคำขอเรียงลำดับใหม่ คำขอ HTTP PUT และคำขอ HTTP DELETE ควรเป็น idempotent แยกกัน - แต่นั่นไม่ได้หมายความว่าลำดับการเรียก PUT และ DELETE บน URL เดียวกันนั้นไม่สำคัญเนื่องจากคำขอ PUT อาจมีผลข้างเคียง!
Robin Green

1

กล่าวโดยย่อการปฏิบัติการ Idempotent หมายความว่าการดำเนินการจะไม่ส่งผลให้เกิดผลลัพธ์ที่แตกต่างกันไม่ว่าคุณจะใช้งานการดำเนินการ idempotent กี่ครั้งก็ตาม

ตัวอย่างเช่นตามข้อกำหนดของข้อมูลจำเพาะของ HTTP GET, HEAD, PUT, and DELETEคือการดำเนินการ idempotent อย่างไรก็ตามPOST and PATCHไม่ใช่ นั่นเป็นเหตุผลที่บางครั้งจะถูกแทนที่ด้วยPOSTPUT


-4

ลองใหม่อีกครั้งปลอดภัย

มักเป็นวิธีที่ง่ายที่สุดในการเข้าใจความหมายในสาขาวิทยาศาสตร์คอมพิวเตอร์


1
ลองซ้ำแสดงถึงสิ่งที่ล้มเหลวในครั้งแรกหรือครั้งก่อนหน้า ไม่เหมือนกันเลยทีเดียว
Lasse V. Karlsen

ใครแก้ไขคำถามของฉันและลงคะแนนให้ฉัน นั่นไม่ใช่ข้อความที่ฉันโพสต์ ???
teknopaul

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