เรากำลังเผยแพร่สำเนารายงานการประชุมอีกครั้ง 2016 ซึ่งจัดขึ้นที่เมืองสโกลโคโว ใกล้กรุงมอสโก เมื่อวันที่ 7-8 พฤศจิกายนปีที่แล้ว บอกวิธีขยายฟังก์ชันการทำงานของ NGINX ด้วย OpenResty และ Lua
สวัสดีทุกคน ฉันชื่อ Vladimir Protasov ฉันทำงานให้กับ Parallels ฉันจะบอกคุณเล็กน้อยเกี่ยวกับตัวฉัน ฉันใช้เวลาสามในสี่ของชีวิตในการเขียนโค้ด ฉันกลายเป็นโปรแกรมเมอร์ถึงแกนหลักในความหมายที่แท้จริง: บางครั้งฉันเห็นโค้ดในฝัน หนึ่งในสี่ของชีวิตคือการพัฒนาอุตสาหกรรม การเขียนโค้ดที่ตรงไปสู่การผลิต Code ที่บางท่านใช้แต่ไม่รู้
ให้มันรู้ว่ามันแย่ขนาดไหน ตอนที่ฉันยังเป็นเด็ก ฉันมาและได้รับฐานข้อมูลขนาด 100 เทราไบต์นี้ ตอนนี้ทุกคนที่นี่มีภาระหนักมาก ฉันไปประชุมแล้วถามว่า: “พวกคุณบอกฉันหน่อยว่าคุณมีข้อมูลขนาดใหญ่ ทุกอย่างเจ๋งไหม? คุณมีฐานกี่ฐาน? พวกเขาตอบฉันว่า: "เรามี 100 กิกะไบต์!" ฉันพูดว่า: "เจ๋งมาก XNUMX กิกะไบต์!" และฉันก็คิดกับตัวเองว่าจะรักษาหน้าโป๊กเกอร์อย่างระมัดระวังได้อย่างไร คุณคิดว่า ใช่ พวกเขาเจ๋งมาก แล้วคุณก็กลับไปแก้ไขฐานข้อมูลหลายเทราไบต์เหล่านี้ และนี่คือการเป็นรุ่นน้อง คุณลองจินตนาการดูว่านี่คือการระเบิดอะไร?
ฉันรู้ภาษาโปรแกรมมากกว่า 20 ภาษา นี่คือสิ่งที่ฉันต้องคิดออกในระหว่างการทำงาน พวกเขาให้โค้ดแก่คุณใน Erlang ใน C ใน C++ ใน Lua ใน Python ใน Ruby ในอย่างอื่น และคุณต้องตัดมันทั้งหมด โดยทั่วไปแล้วฉันต้อง ไม่สามารถคำนวณจำนวนที่แน่นอนได้ แต่ตัวเลขประมาณ 20 หายไป
เนื่องจากทุกคนที่นี่รู้ว่า Parallels คืออะไรและเราทำอะไร ฉันจะไม่พูดถึงว่าเราเจ๋งแค่ไหนและทำอะไรอยู่ ฉันจะบอกคุณเพียงว่าเรามีสำนักงาน 13 แห่งทั่วโลก พนักงานมากกว่า 300 คน มีการพัฒนาในมอสโก ทาลลินน์ และมอลตา หากต้องการคุณสามารถย้ายไปมอลตาได้หากฤดูหนาวมีอากาศหนาวและคุณต้องอุ่นหลัง
โดยเฉพาะแผนกของเราเขียนด้วย Python 2 เราอยู่ในธุรกิจและไม่มีเวลาที่จะใช้เทคโนโลยีที่ทันสมัยดังนั้นเราจึงต้องทนทุกข์ทรมาน เรามีจังโก้เพราะมันมีทุกอย่าง และเราเอาส่วนที่เกินมาทิ้งไป รวมถึง MySQL, Redis และ NGINX เรายังมีสิ่งดีๆอีกมากมาย เรามี MongoDB เรามีกระต่ายวิ่งเล่น เรามีทุกอย่าง แต่ไม่ใช่ของฉัน และฉันไม่ทำ
โอเพ่นเรสตี้
ฉันเล่าเกี่ยวกับตัวเอง มาดูกันว่าฉันจะพูดถึงอะไรในวันนี้:
- OpenResty คืออะไร และรับประทานกับอะไร?
- ทำไมต้องสร้างวงล้อขึ้นมาใหม่ในเมื่อเรามี Python, NodeJS, PHP, Go และสิ่งดีๆ อื่น ๆ ที่ทุกคนพึงพอใจ?
- และตัวอย่างบางส่วนจากชีวิต ผมต้องตัดรายงานเยอะมากเพราะผมใช้เวลา 3,5 ชั่วโมง เลยมีตัวอย่างนิดหน่อย
OpenResty คือ NGINX ต้องขอบคุณเขาที่ทำให้เรามีเว็บเซิร์ฟเวอร์ที่มีคุณสมบัติครบถ้วนซึ่งเขียนได้ดีและทำงานได้อย่างรวดเร็ว ฉันคิดว่าพวกเราส่วนใหญ่ใช้ NGINX ในการผลิต คุณทุกคนรู้ว่าเขาเร็วและเท่ พวกเขาสร้าง I/O แบบซิงโครนัสเจ๋งๆ ขึ้นมา ดังนั้นเราจึงไม่จำเป็นต้องวนรอบอะไร เหมือนอย่างที่พวกเขาทำใน Python Gevent นั้นเจ๋ง เยี่ยมยอด แต่ถ้าคุณเขียนโค้ด C และมีบางอย่างผิดพลาด เมื่อใช้ Gevent คุณจะแก้ไขจุดบกพร่องอย่างบ้าคลั่งได้ ฉันมีประสบการณ์: ใช้เวลาสองวันเต็มในการหาคำตอบว่าเกิดอะไรขึ้นที่นั่น หากไม่มีใครขุดคุ้ยมาเป็นเวลาหลายสัปดาห์ พบปัญหา เขียนบนอินเทอร์เน็ต แต่ Google ไม่พบ เราคงเป็นบ้าไปแล้ว
NGINX ทำการแคชและเนื้อหาแบบคงที่อยู่แล้ว คุณไม่จำเป็นต้องกังวลเกี่ยวกับวิธีการทำแบบมนุษย์เพื่อที่คุณจะได้ไม่ช้าลงที่ไหนสักแห่งเพื่อที่คุณจะได้ไม่สูญเสียคำอธิบายไปที่ไหนสักแห่ง Nginx ปรับใช้ได้สะดวกมาก คุณไม่จำเป็นต้องคิดว่าต้องทำอย่างไร - WSGI, PHP-FPM, Gunicorn, Unicorn มีการติดตั้ง Nginx ซึ่งมอบให้กับผู้ดูแลระบบ พวกเขารู้วิธีการทำงาน Nginx ประมวลผลคำขอในลักษณะที่มีโครงสร้าง ฉันจะพูดถึงเรื่องนี้ในภายหลังเล็กน้อย กล่าวโดยสรุป เขามีช่วงที่เขาเพิ่งยอมรับคำขอ เมื่อประมวลผล และเมื่อเขามอบเนื้อหาให้กับผู้ใช้
Nginx นั้นเจ๋ง แต่มีปัญหาอยู่อย่างหนึ่ง: มันไม่ยืดหยุ่นเพียงพอแม้จะมีฟีเจอร์เจ๋ง ๆ ที่พวกเขาใส่เข้าไปในการกำหนดค่า แม้ว่าจะสามารถปรับแต่งได้ก็ตาม พลังนี้ไม่เพียงพอ ดังนั้นพวกจาก Taobao กาลครั้งหนึ่งฉันคิดว่าเมื่อแปดปีที่แล้วได้สร้าง Lua ขึ้นมา มันให้อะไร?
- ขนาด. มันเล็ก. LuaJIT ให้โอเวอร์เฮดหน่วยความจำประมาณ 100-200 กิโลไบต์และโอเวอร์เฮดด้านประสิทธิภาพขั้นต่ำ
- ความเร็ว. ล่าม LuaJIT นั้นใกล้เคียงกับ C ในหลาย ๆ สถานการณ์ ในบางสถานการณ์ก็แพ้ Java และในบางสถานการณ์ก็มีประสิทธิภาพเหนือกว่า มาระยะหนึ่งแล้ว คอมไพเลอร์ JIT ที่เจ๋งที่สุดถือเป็นสิ่งล้ำสมัย ตอนนี้ก็มีที่เจ๋งกว่าแต่ก็หนักมากเช่น V8 แบบเดียวกัน ล่าม JS และ Java HotSpot บางตัวทำงานได้เร็วกว่าในบางจุด แต่ในบางจุดก็ยังสูญเสียไป
- ง่ายต่อการเรียนรู้. หากคุณมีโค้ดเบส Perl และคุณไม่ได้จอง คุณจะไม่พบโปรแกรมเมอร์ Perl เนื่องจากพวกเขาไม่ได้อยู่ที่นั่น พวกเขาจึงถูกพาตัวไปทั้งหมด การสอนพวกเขาจึงยาวนานและยาก หากคุณต้องการให้โปรแกรมเมอร์ทำอย่างอื่น พวกเขาอาจต้องได้รับการฝึกอบรมใหม่หรือพบ ในกรณีของ Lua ทุกอย่างเรียบง่าย ผู้เยาว์สามารถเรียนรู้ Lua ได้ภายในสามวัน ฉันใช้เวลาประมาณสองชั่วโมงในการคิดออก สองชั่วโมงต่อมา ฉันก็กำลังเขียนโค้ดในการผลิตอยู่แล้ว ประมาณหนึ่งสัปดาห์ต่อมา เขาก็ตรงไปที่ฝ่ายผลิตและจากไป
ด้วยเหตุนี้จึงมีลักษณะดังนี้:

มีมากมายที่นี่ OpenResty ได้รวบรวมโมดูลจำนวนมาก ทั้ง luash และ engins และคุณมีทุกอย่างพร้อม ทั้งปรับใช้และใช้งานได้
ตัวอย่าง
เนื้อเพลงพอแล้ว มาดูโค้ดกันดีกว่า นี่คือ Hello World เล็กน้อย:

มีอะไรอยู่บ้าง? นี่คือตำแหน่งของเครื่องยนต์ เราไม่กังวล เราไม่ได้เขียนเส้นทางของเราเอง เราไม่เตรียมเส้นทางสำเร็จรูป - เรามีอยู่แล้วใน NGINX เราใช้ชีวิตที่ดีและเกียจคร้าน
content_by_lua_block เป็นบล็อกที่ระบุว่าเรากำลังให้บริการเนื้อหาโดยใช้สคริปต์ Lua เราใช้ตัวแปรเครื่องยนต์ remote_addr และใส่มันเข้าไป string.format. นี่ก็เหมือนกับ sprintfเฉพาะใน Lua เท่านั้นที่ถูกต้อง และเรามอบมันให้กับลูกค้า
ผลลัพธ์ที่ได้จะมีลักษณะดังนี้:

แต่กลับไปสู่โลกแห่งความเป็นจริง ในการผลิต ไม่มีใครปรับใช้ Hello World แอปพลิเคชันของเรามักจะไปที่ฐานข้อมูลหรือที่อื่น และโดยส่วนใหญ่แล้วจะรอการตอบกลับ

เพียงแค่นั่งรอ มันไม่ค่อยดีนัก เมื่อมีผู้ใช้ถึง 100.000 ราย เป็นเรื่องยากสำหรับเรา ดังนั้นลองใช้แอปพลิเคชันอย่างง่ายเป็นตัวอย่าง เราจะมองหารูปภาพเช่นแมว มีเพียงเราจะไม่เพียงแค่ค้นหา เราจะขยายคำหลัก และหากผู้ใช้ค้นหา "ลูกแมว" เราจะพบแมว ขนปุย และอื่นๆ ก่อนอื่นเราต้องได้รับข้อมูลคำขอจากแบ็กเอนด์ ดูเหมือนว่านี้:

สองบรรทัดช่วยให้คุณสามารถรับพารามิเตอร์ GET ได้โดยไม่มีความยุ่งยาก ตัวอย่างเช่น เราได้รับข้อมูลนี้จากฐานข้อมูลที่มีตารางตามคีย์เวิร์ดและส่วนขยายโดยใช้แบบสอบถาม SQL ทั่วไป ทุกอย่างเรียบง่าย ดูเหมือนว่านี้:

เราเชื่อมต่อห้องสมุด resty.mysqlซึ่งเรามีอยู่แล้วในชุด เราไม่จำเป็นต้องติดตั้งอะไรเลย ทุกอย่างพร้อมแล้ว ระบุวิธีการเชื่อมต่อและสร้างแบบสอบถาม SQL:

มันน่ากลัวนิดหน่อย แต่ก็ได้ผล ที่นี่ 10 คือขีดจำกัด เราดึงออกมา 10 แผ่น เราขี้เกียจ ไม่อยากแสดงเพิ่ม ใน SQL ฉันลืมเกี่ยวกับขีดจำกัด
ต่อไปเราจะค้นหารูปภาพสำหรับคำถามทั้งหมด เรารวบรวมคำขอจำนวนมากและกรอกตารางลัวะที่เรียกว่า reqsและเราทำได้ ngx.location.capture_multi.

คำขอทั้งหมดเหล่านี้ดำเนินไปพร้อมๆ กัน และคำตอบจะถูกส่งกลับมาหาเรา เวลาทำงานเท่ากับเวลาตอบสนองของเวลาที่ช้าที่สุด หากเราทุกคนถ่ายทำใน 50 มิลลิวินาที และส่งคำขอเป็นร้อยครั้ง เราก็จะได้รับคำตอบใน 50 มิลลิวินาที
เนื่องจากเราขี้เกียจและไม่ต้องการเขียนการจัดการ HTTP และการแคช เราจะทำให้ NGINX ทำทุกอย่างให้เรา อย่างที่คุณเห็นมีการร้องขอ url/fetchนี่เขาคือ:

เราทำง่ายๆ proxy_passระบุตำแหน่งที่จะแคช วิธีการทำ และทุกอย่างได้ผลสำหรับเรา
แต่นี่ยังไม่เพียงพอ เรายังต้องให้ข้อมูลแก่ผู้ใช้อีกด้วย แนวคิดที่ง่ายที่สุดคือการทำให้ทุกอย่างเป็นอนุกรมไปยัง JSON อย่างง่ายดายในสองบรรทัด เราให้ Content-Type เราให้ JSON
แต่มีปัญหาประการหนึ่งคือ ผู้ใช้ไม่ต้องการอ่าน JSON เราจำเป็นต้องดึงดูดนักพัฒนาส่วนหน้า บางครั้งเราไม่รู้สึกอยากทำมันตั้งแต่แรก ใช่แล้ว ผู้เชี่ยวชาญด้าน SEO จะบอกว่าถ้าเรากำลังมองหารูปภาพ พวกเขาก็ไม่สนใจ และถ้าเราให้เนื้อหาแก่พวกเขา พวกเขาจะบอกว่าเครื่องมือค้นหาของเราไม่ได้จัดทำดัชนีอะไรเลย
จะทำอย่างไรกับมัน? แน่นอนว่าเราจะให้ HTML แก่ผู้ใช้ การสร้างด้วยจุดจับนั้นไม่ใช่เรื่องยาก ดังนั้นเราจึงต้องการใช้เทมเพลต มีห้องสมุดสำหรับสิ่งนี้ lua-resty-template.

คุณต้องเคยเห็นตัวอักษร OPM ที่น่าสะพรึงกลัวทั้งสามตัว OpenResty มาพร้อมกับตัวจัดการแพ็คเกจของตัวเอง ซึ่งคุณสามารถติดตั้งโมดูลต่างๆ ได้มากมาย โดยเฉพาะ lua-resty-template. มันเป็นเอ็นจิ้นเทมเพลตธรรมดาที่คล้ายกับเทมเพลต Django ที่นั่นคุณสามารถเขียนโค้ดและทำการทดแทนตัวแปรได้
เป็นผลให้ทุกอย่างจะมีลักษณะดังนี้:

เรานำข้อมูลและแสดงผลเทมเพลตอีกครั้งเป็นสองบรรทัด ผู้ใช้ดีใจได้แมว เนื่องจากเราขยายคำขอ เขาจึงได้รับตราแมวน้ำสำหรับลูกแมวด้วย คุณไม่มีทางรู้ บางทีเขาอาจจะกำลังมองหามัน แต่เขาไม่สามารถกำหนดคำขอของเขาได้อย่างถูกต้อง
ทุกอย่างเจ๋ง แต่เรากำลังอยู่ในการพัฒนาและยังไม่ต้องการแสดงให้ผู้ใช้เห็น มาทำการมอบอำนาจกันเถอะ ในการดำเนินการนี้ มาดูกันว่า NGINX จัดการกับคำขอตามเงื่อนไขของ OpenResty อย่างไร:
- ระยะแรก - เข้าเมื่อผู้ใช้เพิ่งมาถึง และเราดูเขาตามส่วนหัว ตามที่อยู่ IP และข้อมูลอื่น ๆ เราสามารถตัดมันออกได้ทันทีหากเราไม่ชอบมัน ซึ่งสามารถใช้เพื่อขออนุมัติได้ หรือหากเราได้รับคำขอจำนวนมาก เราก็สามารถตัดคำขอเหล่านั้นออกไปได้ง่ายๆ ในขั้นตอนนี้
- เขียนใหม่. เราเขียนข้อมูลคำขอบางส่วนใหม่
- เนื้อหา. เรามอบเนื้อหาให้กับผู้ใช้
- ตัวกรองส่วนหัว. เปลี่ยนส่วนหัวการตอบกลับ หากเราใช้
proxy_passเราสามารถเขียนส่วนหัวบางส่วนใหม่ก่อนที่จะมอบให้กับผู้ใช้ - ตัวกรองร่างกาย. เราสามารถเปลี่ยนร่างกายได้
- เข้าสู่ระบบ — การบันทึก คุณสามารถเขียนบันทึกใน ElasticSearch ได้โดยไม่ต้องมีเลเยอร์เพิ่มเติม
การอนุญาตของเราจะมีลักษณะดังนี้:

เราจะเพิ่มสิ่งนี้เข้ากับอันนั้น locationซึ่งเราได้อธิบายไปแล้ว และใส่โค้ดต่อไปนี้ไว้ที่นั่น:

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

รหัสสำหรับการทำงานกับ Redis นั้นง่ายมากและไม่แตกต่างจากภาษาอื่น ขณะเดียวกันอินพุต/เอาท์พุตทั้งหมดมีอะไรอยู่ตรงนี้ก็ไม่บล็อก หากคุณเขียนโค้ดแบบซิงโครนัส มันจะทำงานแบบอะซิงโครนัส เช่นเดียวกับ gevent ทำได้ดีเท่านั้น

มาทำการอนุญาตกันดีกว่า:

เราบอกว่าเราต้องอ่านเนื้อหาคำขอ เราได้รับข้อโต้แย้ง POST ตรวจสอบว่าการเข้าสู่ระบบและรหัสผ่านถูกต้อง หากไม่ถูกต้องเราจะทำการมอบอำนาจ และหากถูกต้อง เราจะเขียนโทเค็นไปที่ Redis:

อย่าลืมตั้งค่าคุกกี้ซึ่งทำได้ในสองบรรทัด:

ตัวอย่างนั้นเรียบง่ายเป็นการเก็งกำไร แน่นอนว่าเราจะไม่ให้บริการที่แสดงแมวแก่ผู้คน แต่ใครจะรู้จักเรา.. มาดูสิ่งที่สามารถทำได้ในการผลิตกันดีกว่า
- แบ็กเอนด์ที่เรียบง่าย. บางครั้งเราจำเป็นต้องให้ข้อมูลจำนวนไม่น้อยแก่แบ็กเอนด์: บางแห่งเราต้องทดแทนวันที่ บางแห่งเราต้องแสดงรายการบางประเภท บอกว่าขณะนี้มีผู้ใช้กี่คนบนไซต์ สกรูตัวนับหรือสถิติ บางสิ่งบางอย่างเล็กมาก ชิ้นเล็กๆ น้อยๆ บางชิ้นก็ทำได้ง่ายมาก นี่จะรวดเร็ว ง่ายดาย และยอดเยี่ยม
- การประมวลผลข้อมูลล่วงหน้า. บางครั้งเราต้องการฝังโฆษณาในหน้าของเรา และเรานำโฆษณาเหล่านี้ไปพร้อมกับคำขอ API นี่เป็นเรื่องง่ายมากที่จะทำที่นี่ เราไม่โหลดแบ็กเอนด์ของเราซึ่งทำงานหนักอยู่แล้ว คุณสามารถรับและรวบรวมได้ที่นี่ เราสามารถปั้น JS บางส่วนหรือในทางกลับกัน ถอดออก ประมวลผลบางอย่างล่วงหน้าก่อนที่จะมอบให้กับผู้ใช้
- ซุ้มสำหรับไมโครเซอร์วิส. นี่เป็นกรณีที่ดีมากเช่นกัน ฉันได้ดำเนินการแล้ว ก่อนหน้านั้น ฉันทำงานให้กับ Tenzor ซึ่งเป็นบริษัทรายงานทางอิเล็กทรอนิกส์ที่ให้บริการรายงานสำหรับนิติบุคคลประมาณครึ่งหนึ่งในประเทศ เราได้ให้บริการ โดยมีหลายสิ่งหลายอย่างที่ทำโดยใช้กลไกเดียวกัน: การกำหนดเส้นทาง การอนุญาต และอื่นๆ
OpenResty สามารถใช้เป็นกาวสำหรับไมโครเซอร์วิสของคุณเพื่อให้สามารถเข้าถึงทุกสิ่งและอินเทอร์เฟซเดียวได้ เนื่องจากไมโครเซอร์วิสสามารถเขียนในลักษณะที่คุณมี Node.js ที่นี่ คุณมี PHP ที่นี่ คุณมี Python ที่นี่ มีบางอย่างเกี่ยวกับ Erlang ที่นี่ เราเข้าใจดีว่าเราไม่ต้องการเขียนโค้ดเดิมซ้ำทุกที่ จึงสามารถเสียบ OpenResty เข้ากับด้านหน้าได้ - สถิติและการวิเคราะห์. โดยปกติแล้ว NGINX จะอยู่ที่ทางเข้า และคำขอทั้งหมดจะต้องผ่านเข้าไป อยู่ในที่แห่งนี้สะดวกในการรวบรวมมาก คุณสามารถคำนวณบางสิ่งบางอย่างได้ทันทีและโยนมันไปที่ไหนสักแห่ง เช่น Elasticsearch, Logstash เดียวกัน หรือเพียงแค่เขียนมันลงในบันทึกแล้วส่งไปที่ไหนสักแห่ง
- ระบบผู้ใช้หลายราย. ยกตัวอย่างเกมออนไลน์ก็น่าทำมากเช่นกัน วันนี้ที่เคปทาวน์ Alexander Gladysh จะมาบอกคุณถึงวิธีสร้างต้นแบบเกมที่มีผู้เล่นหลายคนอย่างรวดเร็วโดยใช้ OpenResty
- การกรองคำขอ (WAF). ปัจจุบันการสร้างไฟร์วอลล์สำหรับเว็บแอปพลิเคชันทุกประเภทเป็นกระแสนิยม มีบริการต่างๆ มากมายที่มอบให้ เมื่อใช้ OpenResty คุณสามารถสร้างเว็บแอปพลิเคชันไฟร์วอลล์ที่จะกรองคำขอตามความต้องการของคุณได้อย่างง่ายดายและง่ายดาย หากคุณมี Python คุณจะเข้าใจว่า PHP จะไม่ถูกแทรกเข้าไปในตัวคุณอย่างแน่นอน เว้นแต่คุณจะวางมันไว้ที่ใดก็ได้จากคอนโซล คุณรู้ว่าคุณมี MySQL และ Python อาจเป็นไปได้ว่าพวกเขาอาจพยายามทำการข้ามไดเรกทอรีและแทรกบางสิ่งลงในฐานข้อมูล ดังนั้นคุณจึงสามารถกรองข้อความค้นหาแปลก ๆ ได้อย่างรวดเร็วและราคาถูกที่ด้านหน้า
- ชุมชน. เนื่องจาก OpenResty สร้างขึ้นบน NGINX จึงมีโบนัส - นี่คือ ชุมชน NGINX. มันใหญ่มากและคำถามมากมายที่คุณเจอในตอนแรกได้รับคำตอบจากชุมชน NGINX แล้ว
นักพัฒนาลัวะ. เมื่อวานได้คุยกับคนที่มางาน HighLoad++ training day และได้ยินมาว่า Tarantool เท่านั้นที่เขียนเป็นภาษา Lua ไม่เป็นเช่นนั้น มีหลายสิ่งที่เขียนเป็นภาษาลัวะ ตัวอย่าง: OpenResty, เซิร์ฟเวอร์ Prosody XMPP, เอ็นจิ้นเกม Love2D, Lua scripted ใน Warcraft และที่อื่นๆ มีนักพัฒนา Lua จำนวนมาก พวกเขามีชุมชนขนาดใหญ่และตอบสนองได้ดี คำถามลัวะของฉันทั้งหมดได้รับคำตอบภายในไม่กี่ชั่วโมง เมื่อคุณเขียนถึงรายชื่ออีเมล ภายในไม่กี่นาทีก็มีการตอบกลับมากมาย โดยอธิบายว่าอะไร อย่างไร อะไรคืออะไร มันเยี่ยมมาก น่าเสียดายที่ชุมชนที่จริงใจเช่นนี้ไม่ได้มีทุกที่
OpenResty มี GitHub ซึ่งคุณสามารถเปิดปัญหาได้หากมีข้อผิดพลาดเกิดขึ้น มีรายชื่ออีเมลใน Google Groups ที่คุณสามารถพูดคุยเกี่ยวกับประเด็นทั่วไปได้ มีรายชื่ออีเมลเป็นภาษาจีน คุณไม่มีทางรู้ บางทีคุณอาจพูดภาษาอังกฤษไม่ได้ แต่คุณมีความรู้ภาษาจีน
ผลของการ
- ฉันหวังว่าฉันสามารถถ่ายทอดได้ว่า OpenResty เป็นเฟรมเวิร์กเว็บที่สะดวกมาก
- มีเกณฑ์การเข้าต่ำ เนื่องจากโค้ดคล้ายกับที่เราเขียน ภาษาจึงค่อนข้างเรียบง่ายและเรียบง่าย
- มันมี I/O แบบอะซิงโครนัสโดยไม่มีการเรียกกลับ เราจะไม่มีบะหมี่เนื่องจากบางครั้งเราสามารถเขียนใน NodeJS
- มีการปรับใช้ที่ง่ายดาย เนื่องจากเราต้องการเพียง NGINX ที่มีโมดูลที่ถูกต้องและโค้ดของเราเท่านั้น แล้วทุกอย่างก็ใช้งานได้ทันที
- ชุมชนขนาดใหญ่และตอบสนอง
ฉันไม่ได้บอกรายละเอียดวิธีการกำหนดเส้นทาง แต่กลายเป็นเรื่องยาวมาก
ขอบคุณ!

ที่มา: will.com
