ພວກເຮົາໂຕ້ຕອບ C++ ດຽວກະທູ້ກັບຫຼາຍກະທູ້ Rust
ພວກເຮົາໂຕ້ຕອບ C++ ດຽວກະທູ້ກັບຫຼາຍກະທູ້ Rust ການວິເຄາະທີ່ສົມບູນແບບຂອງການໂຕ້ຕອບນີ້ສະຫນອງການກວດສອບລາຍລະອຽດຂອງອົງປະກອບຫຼັກຂອງມັນແລະຜົນສະທ້ອນທີ່ກວ້າງຂວາງ. ເຂດຈຸດສຸມ ການສົນທະນາໄດ້ສຸມໃສ່: ເມຄຫຼັກ...
Mewayz Team
Editorial Team
ພວກເຮົາຕິດຕໍ່ກັບ 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_unwindRust ຂອງ 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 ທຸລະກິດທີ່ທັນສະໄຫມສາມາດເຮັດໄດ້ສໍາລັບທີມງານຂອງທ່ານ.
We use cookies to improve your experience and analyze site traffic. Cookie Policy