Hacker News

ພວກເຮົາໂຕ້ຕອບ C++ ດຽວກະທູ້ກັບຫຼາຍກະທູ້ Rust

ພວກເຮົາໂຕ້ຕອບ C++ ດຽວກະທູ້ກັບຫຼາຍກະທູ້ Rust ການວິເຄາະທີ່ສົມບູນແບບຂອງການໂຕ້ຕອບນີ້ສະຫນອງການກວດສອບລາຍລະອຽດຂອງອົງປະກອບຫຼັກຂອງມັນແລະຜົນສະທ້ອນທີ່ກວ້າງຂວາງ. ເຂດຈຸດສຸມ ການ​ສົນ​ທະ​ນາ​ໄດ້​ສຸມ​ໃສ່​: ເມຄຫຼັກ...

1 min read Via antithesis.com

Mewayz Team

Editorial Team

Hacker News
ນີ້ແມ່ນບົດຄວາມ blog SEO ທີ່ສົມບູນ:

ພວກເຮົາຕິດຕໍ່ກັບ C++ Single-Threaded ກັບຫຼາຍກະທູ້ Rust

ການ​ເຊື່ອມ​ຕໍ່​ລະ​ຫັດ C++ ເສັ້ນ​ດຽວ​ກັບ Rust ຫຼາຍ​ກະ​ທູ້​ແມ່ນ​ບໍ່​ພຽງ​ແຕ່​ເປັນ​ໄປ​ໄດ້ — ມັນ​ເປັນ​ຫນຶ່ງ​ໃນ​ວິ​ທີ​ການ​ປະ​ຕິ​ບັດ​ທີ່​ສຸດ​ໃນ​ການ​ປັບ​ປຸງ​ລະ​ບົບ​ມໍ​ລະ​ດົກ​ທີ່​ທັນ​ສະ​ໄຫມ​ໂດຍ​ບໍ່​ມີ​ການ​ຂຽນ​ຄືນ​ໃຫມ່​ຢ່າງ​ເຕັມ​ທີ່​. ທີ່ Mewayz, ພວກເຮົາໄດ້ຮັບມືກັບສິ່ງທ້າທາຍທີ່ແນ່ນອນນີ້ເມື່ອຂະຫຍາຍລະບົບທຸລະກິດ 207-ໂມດູນຂອງພວກເຮົາເພື່ອຮັບໃຊ້ຜູ້ໃຊ້ 138,000 ຄົນ, ແລະຜົນໄດ້ຮັບໄດ້ປ່ຽນແປງພື້ນຖານທີ່ພວກເຮົາຄິດກ່ຽວກັບການເຮັດວຽກຮ່ວມກັນຂອງລະບົບ.

ເປັນ​ຫຍັງ​ທ່ານ​ຈຶ່ງ​ຈະ​ໂຕ້​ຕອບ C++ ດຽວ​ກະ​ທູ້​ດຽວ​ກັບ​ຫຼາຍ​ກະ​ທູ້ Rust?

ລະບົບການຜະລິດສ່ວນໃຫຍ່ມີລະຫັດ C++ ທີ່ທົດສອບການສູ້ຮົບຫຼາຍປີ. ການຂຽນຄືນໃຫມ່ທຸກຢ່າງໃນ Rust ເບິ່ງຄືວ່າຫນ້າສົນໃຈໃນເຈ້ຍ, ແຕ່ມັນແນະນໍາຄວາມສ່ຽງອັນໃຫຍ່ຫຼວງແລະເວລາວິສະວະກໍາຫຼາຍເດືອນ. ແນວທາງປະຕິບັດຄືການຮັບປະທານແບບເພີ່ມຕື່ມ — ຫໍ່ດ້ວຍເຫດຜົນ C++ ທີ່ມີຢູ່ແລ້ວ ໃນຂະນະທີ່ການໂຫຼດປະລິມານວຽກທີ່ໜັກໜ່ວງຕໍ່ເນື່ອງກັນກັບຕົວແບບການເປັນເຈົ້າຂອງຂອງ Rust.

ໃນ​ກໍ​ລະ​ນີ​ຂອງ​ພວກ​ເຮົາ, ໂມ​ດູນ​ຫຼັກ​ເຫດ​ຜົນ​ທຸ​ລະ​ກິດ​ໄດ້​ດໍາ​ເນີນ​ການ​ທີ່​ເຊື່ອ​ຖື​ໄດ້​ໃນ C++ ດຽວ​ກະ​ທູ້​ສໍາ​ລັບ​ປີ​. ພວກເຂົາເຈົ້າຈັດການກັບການປະມວນຜົນວຽກຕາມລໍາດັບ, ການສ້າງເອກະສານ, ແລະການຄິດໄລ່ທາງດ້ານການເງິນ. ແຕ່ຍ້ອນວ່າຖານຜູ້ໃຊ້ຂອງພວກເຮົາເພີ່ມຂຶ້ນຜ່ານ 100K, ພວກເຮົາຕ້ອງການການປະມວນຜົນຂໍ້ມູນຂະຫນານ, ການຈັດການ API ພ້ອມກັນ, ແລະການຄຸ້ມຄອງລັດແບ່ງປັນທີ່ປອດໄພ. ລັກສະນະ Send ແລະ Sync ຂອງ Rust ໄດ້ໃຫ້ຄວາມສອດຄ່ອງກັນກັບພວກເຮົາທີ່ຮັບປະກັນວ່າ C++ ບໍ່ສາມາດສະເໜີໃຫ້ໄດ້ຫາກບໍ່ມີການກວດສອບຄູ່ມືຢ່າງກວ້າງຂວາງ.

ແຮງຈູງໃຈຫຼັກແມ່ນການຫຼຸດຜ່ອນຄວາມສ່ຽງ. ທ່ານຮັກສາສິ່ງທີ່ເຮັດວຽກ, ແລະທ່ານເພີ່ມຂະຫນາດໃດ - ໂດຍບໍ່ມີການຫຼີ້ນການພະນັນລະຫັດທັງຫມົດຂອງທ່ານໃນການເຄື່ອນຍ້າຍທີ່ອາດຈະບໍ່ສໍາເລັດ.

ເຂດແດນ FFI ເຮັດວຽກແນວໃດ?

ການໂຕ້ຕອບຟັງຊັນຕ່າງປະເທດ (FFI) ລະຫວ່າງ C++ ແລະ Rust ດໍາເນີນການຜ່ານລາຍເຊັນຟັງຊັນ C-compatible. extern "C" ຂອງ Rust ຂັດຂວາງຟັງຊັນທີ່ C++ ສາມາດໂທຫາໄດ້ໂດຍກົງ, ແລະໃນທາງກັບກັນ. ສິ່ງທ້າທາຍອັນສຳຄັນເກີດຂຶ້ນເມື່ອເວລາແລ່ນຫຼາຍກະທູ້ຂອງ Rust ຕ້ອງການເອີ້ນລະຫັດ C++ ເສັ້ນດ່ຽວຢ່າງປອດໄພ.

ພວກເຮົາແກ້ໄຂອັນນີ້ໂດຍໃຊ້ສະຖາປັດຕະຍະກຳສະເພາະ:

  • Thread-confined C++ executor: call C++ ທັງໝົດແມ່ນ funneled ຜ່ານ thread ສະເພາະອັນດຽວໂດຍໃຊ້ຊ່ອງທາງການສົ່ງຂໍ້ຄວາມ, ຮັບປະກັນວ່າ invariant single-threaded ບໍ່ເຄີຍຖືກລະເມີດ.
  • ຊັ້ນຂົວ Rust async: ໜ້າວຽກຂອງ Tokio ສົ່ງວຽກໄປໃຫ້ຕົວປະຕິບັດການ C++ ແລະ ລໍຖ້າ ຜົນໄດ້ຮັບຜ່ານຊ່ອງ oneshot, ຮັກສາດ້ານ Rust ທີ່ບໍ່ຊິ້ງໂຄ້ງຢ່າງຄົບຖ້ວນ.
  • ການຈັດການຕົວຊີ້ແບບທາສີ: ວັດຖຸ C++ ຖືກຫຸ້ມດ້ວຍໂຄງສ້າງ Rust ທີ່ປະຕິບັດ Drop ສໍາລັບການທໍາຄວາມສະອາດທີ່ກໍານົດ, ປ້ອງກັນການຮົ່ວໄຫລຂອງຫນ່ວຍຄວາມຈໍາໃນທົ່ວຂອບເຂດພາສາ.
  • Serialization ຢູ່ເຂດແດນ: ໂຄງສ້າງຂໍ້ມູນທີ່ຊັບຊ້ອນຖືກຈັດລໍາດັບເປັນ FlatBuffers ຢູ່ທີ່ຊັ້ນ FFI, ຫຼີກເວັ້ນການຈັບຄູ່ໂຄງຮ່າງໂຄງສ້າງທີ່ອ່ອນແອ ແລະເຮັດໃຫ້ການວິວັດທະນາການເອກະລາດຂອງແຕ່ລະດ້ານ.
  • Panic isolation: catch_unwind Rust ຂອງ Rust ກວມເອົາທຸກຈຸດເຂົ້າ FFI ເພື່ອບໍ່ໃຫ້ຄວາມຕື່ນຕົກໃຈຂ້າມຂອບເຂດພາສາ, ເຊິ່ງຈະເປັນພຶດຕິກໍາທີ່ບໍ່ໄດ້ກໍານົດ.

ແບບ​ແຜນ​ນີ້​ເຮັດ​ໃຫ້​ພວກ​ເຮົາ​ໄດ້​ຮັບ​ຄວາມ​ເຊື່ອ​ຖື​ຂອງ Rust ຫຼາຍ​ກະ​ທູ້​ທີ່​ມີ​ຄວາມ​ເຊື່ອ​ຖື​ຂອງ​ຫຼັກ​ການ C++ ທີ່​ໄດ້​ຮັບ​ການ​ພິ​ສູດ — ໂດຍ​ບໍ່​ມີ​ການ​ຂຽນ​ຄືນ​ໃໝ່​ເສັ້ນ​ດຽວ​ຂອງ​ກົດ​ເກນ​ທຸ​ລະ​ກິດ​ເດີມ.

ອັນ​ໃດ​ເປັນ​ອຸບ​ສັກ​ທີ່​ໃຫຍ່​ທີ່​ສຸດ​ທີ່​ຕ້ອງ​ຫຼີກ​ລ່ຽງ?

ຄວາມຜິດພາດທີ່ອັນຕະລາຍທີ່ສຸດແມ່ນການສົມມຸດວ່າລະຫັດ C++ ແມ່ນປອດໄພກັບກະທູ້ເມື່ອມັນບໍ່ເປັນ. ສະຖານະທົ່ວໂລກ, ຕົວແປສະຖິດ, ແລະການເອີ້ນຫ້ອງສະໝຸດແບບບໍ່ຕໍ່ເນື່ອງຈະເຮັດໃຫ້ເກີດການແຂ່ງຂັນຂໍ້ມູນທີ່ຜູ້ລວບລວມຂໍ້ມູນຂອງ Rust ບໍ່ສາມາດກວດພົບໄດ້ໃນທົ່ວຂອບເຂດ FFI. ການຮັບປະກັນຄວາມປອດໄພຂອງ Rust ຢຸດຢູ່ທີ່ບລັອກ ບໍ່ປອດໄພ — ທຸກຢ່າງພາຍໃນແມ່ນຄວາມຮັບຜິດຊອບຂອງເຈົ້າ.

ຄວາມເຂົ້າໃຈສຳຄັນ: Rust ຮັບປະກັນຄວາມປອດໄພຂອງໜ່ວຍຄວາມຈຳພາຍໃນລະຫັດຂອງມັນເອງ, ແຕ່ເມື່ອເຈົ້າຂ້າມເຂດແດນ FFI ເຂົ້າໄປໃນ C++, ເຈົ້າຈະສືບທອດທຸກໆບັນຫາຄວາມປອດໄພກະທູ້ທີ່ C++ ມີ. ສະຖາປັດຕະຍະກຳອ້ອມຮອບຂອບເຂດນັ້ນສຳຄັນກວ່າລະຫັດຂອງທັງສອງຂ້າງ.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

ອຸ​ປະ​ສັກ​ທີ່​ພົບ​ເຫັນ​ອີກ​ຢ່າງ​ໜຶ່ງ​ແມ່ນ​ການ​ຄຸ້ມ​ຄອງ​ຕະ​ຫຼອດ​ຊີ​ວິດ. ວັດຖຸ C++ ບໍ່ໄດ້ເຂົ້າຮ່ວມໃນຕົວກວດສອບການກູ້ຢືມຂອງ Rust. ຖ້າ Rust ຫຼຸດລົງການອ້າງອິງໃນຂະນະທີ່ C ++ ຍັງຖືຕົວຊີ້, ທ່ານໄດ້ຮັບຂໍ້ບົກພ່ອງທີ່ບໍ່ມີການນໍາໃຊ້ທີ່ມີຄວາມຫຍຸ້ງຍາກຢ່າງໂຫດຮ້າຍທີ່ຈະວິນິດໄສ. ພວກເຮົາແກ້ໄຂເລື່ອງນີ້ໂດຍການບັງຄັບໃຊ້ຄວາມເປັນເຈົ້າຂອງທີ່ເຂັ້ມງວດ: ວັດຖຸ C++ ສະເຫມີເປັນເຈົ້າຂອງໂດຍ Rust wrapper ອັນດຽວ, ແລະການເຂົ້າເຖິງທີ່ໃຊ້ຮ່ວມກັນແມ່ນຜ່ານການນັບອ້າງອີງຕາມ Arc ຢູ່ດ້ານ Rust.

ການເອີ້ນ FFI ທີ່ມີປະສິດຕິພາບ, ຫຼາຍເກີນໄປຈະສ້າງສ່ວນເກີນຈາກການປ່ຽນບໍລິບົດ ແລະການຈັດລໍາດັບ. ພວກ​ເຮົາ​ດຳ​ເນີນ​ການ​ເປັນ​ຊຸດ​ບ່ອນ​ໃດ​ກໍ​ຕາມ​ທີ່​ເປັນ​ໄປ​ໄດ້, ສົ່ງ​ແຖວ​ຂອງ​ລາຍ​ການ​ວຽກ​ໄປ​ໃຫ້​ຕົວ​ປະ​ຕິ​ບັດ C++ ແທນ​ທີ່​ຈະ​ເຮັດ​ການ​ໂທ​ຂ້າມ​ພາ​ສາ​ແຕ່​ລະ​ຄົນ.

ວິທີການນີ້ປະຕິບັດໃນການຜະລິດແນວໃດ?

ຫຼັງ​ຈາກ​ການ​ນຳ​ໃຊ້​ສະ​ຖາ​ປັດ​ຕະ​ຍະ​ກຳ​ປະສົມ​ໄປ​ທົ່ວ​ແພລດ​ຟອມ​ຂອງ​ພວກ​ເຮົາ, ພວກ​ເຮົາ​ໄດ້​ວັດ​ແທກ​ການ​ປັບ​ປຸງ​ຢ່າງ​ເປັນ​ຈິງ. ການສົ່ງຂໍ້ມູນການຮ້ອງຂໍເພີ່ມຂຶ້ນ 3.4x ສໍາລັບໂມດູນທີ່ເຄີຍມີຄໍຂວດຢູ່ໃນການປະມວນຜົນ C++ ຕາມລໍາດັບ. latency ຫາງ (p99) ຫຼຸດລົງ 61% ເພາະວ່າເວລາແລ່ນ async ຂອງ Rust ສາມາດປະມວນຜົນການຮ້ອງຂໍແບບເອກະລາດໄດ້ພ້ອມກັນ ໃນຂະນະທີ່ C++ ຈັດການກັບວຽກທີ່ໜັກໜ່ວງໃນເລື່ອງການຄິດໄລ່ຂອງມັນ.

ສິ່ງສຳຄັນກວ່ານັ້ນ, ພວກເຮົາມີຈຸດບົກພ່ອງທີ່ກ່ຽວຂ້ອງກັບສະກຸນເງິນກ້ອນໃນຫົກເດືອນທຳອິດຂອງການຜະລິດ. ຮູບແບບການກັກຕົວກະທູ້ເຮັດໃຫ້ມັນເປັນໄປບໍ່ໄດ້ໃນໂຄງສ້າງສໍາລັບລະຫັດ C ++ ທີ່ຈະຖືກເອີ້ນຈາກຫຼາຍຫົວຂໍ້, ໃນຂະນະທີ່ລະບົບປະເພດຂອງ Rust ປ້ອງກັນການແຂ່ງຂັນຂໍ້ມູນຢູ່ຂ້າງຂອງມັນ. ນີ້​ແມ່ນ​ການ​ປັບ​ປຸງ​ທີ່​ສໍາ​ຄັນ​ຕໍ່​ວິ​ທີ​ການ​ທີ່​ຜ່ານ​ມາ​ຂອງ​ພວກ​ເຮົາ​ທີ່​ຈະ​ພະ​ຍາ​ຍາມ​ທີ່​ຈະ​ເພີ່ມ​ກະ​ທູ້​ກັບ C++ ກັບ mutexes​, ເຊິ່ງ​ໄດ້​ຜະ​ລິດ​ສາມ​ເຫດ​ການ​ເຊື້ອ​ຊາດ​ໃນ​ໄຕ​ມາດ​ດຽວ​.

ທີມງານວິສະວະກອນຍັງໄດ້ລາຍງານຮອບວຽນການຊໍ້າຄືນທີ່ໄວຂຶ້ນ. ຄຸນສົມບັດໃຫມ່ສາມາດຖືກສ້າງຂື້ນໃນ Rust ດ້ວຍການຮອງຮັບເຕັມຮູບແບບ, ໃນຂະນະທີ່ໂມດູນ C++ ທີ່ມີຢູ່ແລ້ວສືບຕໍ່ເຮັດວຽກໂດຍບໍ່ມີການດັດແປງ. ຍຸດທະສາດທີ່ເພີ່ມຂຶ້ນນີ້ຫມາຍຄວາມວ່າພວກເຮົາບໍ່ເຄີຍມີການເຄື່ອນຍ້າຍ "big bang" ຄວາມສ່ຽງສູງ - ພຽງແຕ່ການປັບປຸງທີ່ຄົງທີ່, ສາມາດວັດແທກໄດ້.

ຄຳຖາມທີ່ຖາມເລື້ອຍໆ

ສາ​ມາດ Rust ໂທ​ຫາ​ຫ້ອງ​ສະ​ຫມຸດ C++ ດຽວ​ກະ​ທູ້​ໂດຍ​ບໍ່​ມີ​ການ​ດັດ​ແກ້​?

ແມ່ນແລ້ວ, ແຕ່ທ່ານຕ້ອງຮັບປະກັນວ່າການໂທທັງໝົດໄປຫາຫ້ອງສະໝຸດນັ້ນເກີດຂຶ້ນຈາກຫົວຂໍ້ດຽວ. ຮູບ​ແບບ​ມາດ​ຕະ​ຖານ​ແມ່ນ​ການ​ສ້າງ​ກະ​ທູ້​ຜູ້​ປະ​ຕິ​ບັດ​ການ​ອຸ​ທິດ​ຕົນ​ທີ່ serializes ການ​ໂທ C++ ທັງ​ຫມົດ​ໂດຍ​ຜ່ານ​ຊ່ອງ​ທາງ​ການ​. ວຽກງານ async ຂອງ Rust ສົ່ງຄໍາຮ້ອງຂໍແລະລໍຖ້າການຕອບສະຫນອງໂດຍບໍ່ມີການສະກັດ runtime multi-threaded. ລະຫັດ C++ ຕົວມັນເອງບໍ່ຕ້ອງການການປ່ຽນແປງ — ຂໍ້ຈໍາກັດດ້ານຄວາມປອດໄພຖືກບັງຄັບໃຊ້ທັງໝົດໃນດ້ານ Rust.

FFI overhead ມີ​ຄວາມ​ສໍາ​ຄັນ​ພຽງ​ພໍ​ທີ່​ຈະ​ມີ​ຜົນ​ກະ​ທົບ​ການ​ປະ​ຕິ​ບັດ​ຂອງ​ຄໍາ​ຮ້ອງ​ສະ​ຫມັກ​ບໍ?

ການໂທ FFI ສ່ວນບຸກຄົນມີຄ່າໃຊ້ຈ່າຍຫນ້ອຍທີ່ສຸດ - ໂດຍປົກກະຕິພາຍໃຕ້ 10 nanoseconds ສໍາລັບການໂທແບບງ່າຍດາຍ. ຢ່າງໃດກໍຕາມ, serialization ຂອງໂຄງສ້າງຂໍ້ມູນສະລັບສັບຊ້ອນແລະການ synchronization ກະທູ້ຢູ່ເຂດແດນຈະເພີ່ມຂຶ້ນຖ້າຫາກວ່າທ່ານໂທຫາຫຼາຍພັນໂທລະອຽດ. ການປະຕິບັດການເປັນຊຸດ ແລະການໃຊ້ຮູບແບບການຄັດລອກແບບສູນການສຳເນົາເຊັ່ນ FlatBuffers ຫຼື Cap'n Proto ຮັກສາໄດ້ບໍ່ໜ້ອຍເຖິງແມ່ນວ່າຢູ່ໃນຂະໜາດ.

ພວກເຮົາຄວນຂຽນລະຫັດ C++ ຂອງພວກເຮົາຄືນໃໝ່ໃນ Rust ແທນການຕິດຕໍ່ກັນບໍ?

ສຳ​ລັບ​ທີມ​ງານ​ສ່ວນ​ໃຫຍ່, ການ​ໂຕ້​ຕອບ​ທີ່​ເພີ່ມ​ຂຶ້ນ​ແມ່ນ​ເສັ້ນ​ທາງ​ທີ່​ປອດ​ໄພ​ແລະ​ໄວ​ກວ່າ. ການຂຽນຄືນໃຫມ່ເຕັມທີ່ແນະນໍາຄວາມສ່ຽງດ້ານວິສະວະກໍາຫຼາຍເດືອນໂດຍບໍ່ມີຄ່າທີ່ຜູ້ໃຊ້ປະເຊີນຈົນກ່ວາສໍາເລັດ. Interfacing ຊ່ວຍໃຫ້ທ່ານສາມາດປັບປຸງການຂົນສົ່ງທັນທີ, ກວດສອບວິທີການ Rust ໃນການຜະລິດ, ແລະຍ້າຍໂມດູນຫນຶ່ງຄັ້ງຕໍ່ເວລາໂດຍອີງໃສ່ບ່ອນທີ່ concurrency ມີຜົນກະທົບຫຼາຍທີ່ສຸດ. ຂຽນຄືນພຽງແຕ່ໂມດູນທີ່ຄ່າໃຊ້ຈ່າຍໃນການຮັກສາເຂດແດນ FFI ເກີນຄ່າໃຊ້ຈ່າຍຂອງການຂຽນຄືນໃຫມ່.


ທີ່ Mewayz, ພວກເຮົາກໍ່ສ້າງພື້ນຖານໂຄງລ່າງທີ່ມີຂະໜາດ — ທັງທາງດ້ານເຕັກນິກ ແລະ ການປະຕິບັດງານ. OS ທຸລະກິດ 207 ໂມດູນຂອງພວກເຮົາຊ່ວຍໃຫ້ທີມງານ 138,000 ຄົນດຳເນີນຂະບວນການເຮັດວຽກທີ່ສະຫຼາດຂຶ້ນ ເລີ່ມຕົ້ນທີ່ $19/ເດືອນ. ບໍ່ວ່າທ່ານກໍາລັງຈັດການໂຄງການ, ການດໍາເນີນງານອັດຕະໂນມັດ, ຫຼືຂະຫຍາຍທຸລະກິດຂອງທ່ານ, Mewayz ປັບຕົວເຂົ້າກັບວິທີການເຮັດວຽກຂອງທ່ານ. ເລີ່ມການທົດລອງໃຊ້ຟຣີຂອງທ່ານທີ່ app.mewayz.com ແລະເບິ່ງສິ່ງທີ່ OS ທຸລະກິດທີ່ທັນສະໄຫມສາມາດເຮັດໄດ້ສໍາລັບທີມງານຂອງທ່ານ.