ในระหว่างการประชุมอัปเดตโครงการเมื่อเร็วๆ นี้ ทีมของฉันได้พูดคุยเกี่ยวกับวิธีที่เราจะใช้การทำให้เป็นอนุกรมในการส่งข้อมูลไปมาจากแอปพลิเคชันนี้
วิศวกรที่กำลังมองหาโครงการซอฟต์แวร์เพิ่มเติมบอกฉันว่าพวกเขาไม่คุ้นเคยกับคำศัพท์นี้
เป็นเรื่องง่ายที่จะพลาดกระบวนการที่สำคัญเช่นนี้ ซึ่งจะไม่เกิดขึ้นจนกว่าคุณจะดำดิ่งสู่โครงการที่กว้างขวางยิ่งขึ้น นี่เป็นกรณีของบุคคลนี้เช่นเดียวกับฉัน ณ จุดหนึ่ง
ฉันก็เลยอยากเขียนเกี่ยวกับมัน ฉันช่วยให้เพื่อนร่วมงานของฉันเรียนรู้เกี่ยวกับการทำให้เป็นอันดับในวันนั้น และคุณจะได้เรียนรู้เกี่ยวกับเรื่องนี้ในวันนี้
การทำให้เป็นอันดับคืออะไร
การทำให้เป็นอนุกรมเป็นกระบวนการที่บริการหนึ่งใช้โครงสร้างข้อมูล เช่น พจนานุกรมใน Python ห่อหุ้ม และส่งไปยังบริการอื่นเพื่ออ่าน นั่นคือคำจำกัดความง่ายๆ
ลองนึกภาพว่าฉันต้องส่งข้อความถึงใครซักคน ดังนั้นฉันจึงเขียนข้อความลงบนตัวต่อที่ประกอบแล้ว ฉันแยกชิ้นส่วน เพิ่มคำแนะนำเกี่ยวกับวิธีการประกอบตัวต่อใหม่ และส่งไปพร้อมกัน
ผู้รับข้อความจะได้ชิ้นส่วนของปริศนา รวบรวมทั้งหมด และตอนนี้ก็มีข้อความของฉันแล้ว
คำจำกัดความทางเทคนิคนั้นสนุกกว่าเล็กน้อย เพื่อความฉลาด การทำให้เป็นอนุกรมเป็นกระบวนการของการแปลงออบเจ็กต์ข้อมูลเป็นสตรีมไบต์ และบันทึกสถานะของอ็อบเจ็กต์ที่จะจัดเก็บไว้ในดิสก์หรือส่งผ่านเครือข่าย วิธีนี้ช่วยลดขนาดพื้นที่เก็บข้อมูลที่จำเป็นและทำให้โอนข้อมูลผ่านเครือข่ายได้ง่ายขึ้น
Marshaling และ Serialization - อะไรคือความแตกต่าง?
กระบวนการของการจัดการอาจมาถึงใจ Marshaling เป็นกระบวนการเปลี่ยนการแสดงหน่วยความจำของวัตถุให้อยู่ในรูปแบบที่เหมาะสมสำหรับการส่งสัญญาณ
แม้ว่าการจัดตำแหน่งและการทำให้เป็นอันดับจะ หลวม ตรงกันมีความแตกต่างที่สำคัญ ตัวอย่างเช่น เมื่อสร้างโปรแกรม Golang เพื่ออ่านข้อมูล JSON ลงในโครงสร้างข้อมูล Golang คุณอาจใช้ marshaling เพื่อแปลค่าคีย์ JSON เป็นค่าคีย์ Golang
ความแตกต่างคืออาจใช้ marshaling เพื่อแปลข้อมูล ในทางกลับกัน การทำให้เป็นอนุกรมจะส่งหรือจัดเก็บข้อมูลในสตรีมแบบไบต์และประกอบกลับเข้าที่ในรูปแบบเดิม ทั้งสองทำเป็นซีเรียลไลซ์เซชั่น แต่มีเจตนาต่างกันในทั้งสองกระบวนการ
คุณสามารถดูโครงสร้างนี้ที่ฉันสร้างขึ้นเพื่อโต้ตอบกับข้อมูล Twitter ด้านล่างเป็นตัวอย่างของการจัดระเบียบในการดำเนินการ ใน Golang คุณสามารถให้คำแนะนำที่เรียกว่าแท็ก ซึ่งสามารถแปลงวัตถุนี้เป็นข้อมูล JSON ได้อย่างง่ายดายโดยใช้บริการ marshaling ในตัวของ Golang
Endianness คืออะไร
ฉันยังอยากจะสัมผัสเรื่องของความเอนเดียนเนสเบาๆ Endianness เป็นคำที่ใช้อธิบายลำดับของไบต์ในหน่วยความจำ
คุณสามารถคิดว่าหน่วยความจำเป็นบล็อกที่เก็บข้อมูลไว้ เพื่อให้การซีเรียลไลซ์เซชั่นทำงาน ไบต์สตรีมจำเป็นต้องถ่ายโอนประเภทข้อมูลโดยไม่คำนึงถึง endianness ที่เปลี่ยนแปลงจากระบบหนึ่งไปอีกระบบหนึ่ง
คุณสามารถดูความแตกต่างเล็กและใหญ่ด้านล่าง จำเป็นอย่างยิ่งที่ endianness จะต้องจับคู่จากระบบหนึ่งไปยังอีกระบบหนึ่งหรือถูกแปลงอย่างใด เนื่องจากไม่ใช่ทุกระบบจะเรียงลำดับบิตในลักษณะเดียวกัน
กรณีการใช้งานสำหรับ Serialization
กรณีการใช้งานของเราใช้ประโยชน์จากคุณสมบัติเหล่านี้อย่างเต็มที่ เราวางแผนที่จะรับข้อมูลบางส่วนจากฮาร์ดแวร์ที่เรากำลังสแกน บรรจุข้อมูลนั้นลงในไบต์สตรีม และส่งไปพร้อมกับเครือข่ายไปยังบริการอื่นที่จะสร้างข้อมูลขึ้นใหม่
กระบวนการย้อนกลับกระบวนการทำให้เป็นอันดับและสร้างข้อมูลใหม่กลับเป็นรูปแบบเดิมเรียกว่า ดีซีเรียลไลเซชัน .
มีกรณีการใช้งานอื่นสำหรับสิ่งนี้ ตัวอย่างเช่น REST API หรือโปรโตคอลการส่งข้อความ เช่น AMQP สามารถใช้การทำให้เป็นอนุกรมเพื่อบีบอัดและส่งข้อมูล
AMQP เป็นโปรโตคอลการส่งข้อความที่คุณส่งข้อความไปยังนายหน้า AMQP และบริการรับกำลัง "ฟัง" กับนายหน้ารายนี้เพื่อรับข้อความ วิศวกรแบ็กเอนด์อาจทราบเรื่องนี้เป็นอย่างดี เนื่องจากมักใช้สำหรับส่งข้อมูลไปมาภายในระบบแบบกระจาย
ภาษาโปรแกรมหลายภาษารวมถึงความสามารถในการสร้างซีเรียลไลซ์เซชั่นบางอย่างได้อย่างง่ายดาย จึงเป็นหัวข้อที่ไม่เกี่ยวกับภาษา
ตัวอย่างการทำให้เป็นอนุกรม
มายกตัวอย่างอย่างรวดเร็ว รหัสนี้ใช้ไลบรารี kombu เพื่อส่งข้อความผ่าน AMQP เราใช้สิ่งนี้เพื่อส่งข้อความจากแพ็คเกจซอฟต์แวร์หนึ่งไปยังอีกแพ็คเกจหนึ่งผ่านเครือข่าย รหัสนี้ใช้สำหรับบริการส่งข้อความถึงนายหน้า AMQP:
def send_message(self, payload, sender_serializer):
...
try:
producer.publish(
{'payload': message},
...
serializer = 'json',
...
)
return
จด publish
กระบวนการ. เรากำลังส่งต่อวิธีการซีเรียลไลซ์เซชันเป็นอาร์กิวเมนต์ เพื่อให้ไลบรารีรู้วิธีจัดลำดับข้อมูลที่เรากำลังส่งผ่าน
ข้อความข้อมูลจะถูกแปลงเป็นสตรีมไบต์ ซึ่งถ้าคุณดูมัน จะดูเหมือนเป็นตัวอักษรและตัวเลขยาวๆ แล้วเราจะส่งข้อความนั้นไป
บริการที่เกี่ยวข้องจะใช้วิธีการทำให้เป็นอนุกรมเดียวกันเพื่อสร้างข้อมูลขึ้นใหม่ในสถานะเดิม นี่เป็นคุณลักษณะที่สำคัญในขณะที่เรากำลังสร้างชุดเครื่องมือที่จำเป็นต้องสามารถส่งข้อความถึงกันเพื่อให้ทำงานได้
รูปแบบข้อมูลการทำให้เป็นอนุกรม
ฉันใช้ JSON สำหรับการทำให้เป็นอนุกรมทุกครั้งที่มีงานเรียก อย่างไรก็ตาม คุณสามารถใช้อย่างอื่นได้
JSON มีค่าใช้จ่ายมากมาย แต่ความสามารถในการอ่านของมนุษย์ทำให้เหมาะสำหรับฉัน คุณยังสามารถใช้ Protobufs, YAML หรือ XML ได้อีกด้วย นี่เป็นเพียงรูปแบบออบเจ็กต์ข้อมูลบางส่วนที่คุณสามารถใช้ได้
บทสรุป
ฉันดีใจที่ได้สิ่งนี้ออกจากระบบของฉัน ฉันต้องหยุดคิดเกี่ยวกับเรื่องนี้ และหวังว่าจะมีคนเรียนรู้บางอย่างจากมัน
ซีเรียลไลซ์เซชั่นกลายเป็นสิ่งจำเป็นเมื่อคุณรวบรวมไปป์ไลน์การสื่อสารของคุณ เป็นเรื่องดีที่จะรู้เกี่ยวกับหัวข้อนี้เพื่อให้รู้สึกมั่นใจในการใช้เครื่องมือใดๆ ก็ตามที่คุณใช้ด้วยความรู้พื้นฐานที่เหมาะสม
-จอร์จ