ย้ายข้อมูลจากงานพุลคิวงานของ App Engine ไปยัง Cloud Pub/Sub (โมดูล 19)

1. ภาพรวม

ชุด Codelab ของ Serverless Migration Station (บทแนะนำแบบลงมือปฏิบัติจริงที่ทำตามได้ด้วยตนเอง) และวิดีโอที่เกี่ยวข้องมีจุดมุ่งหมายเพื่อช่วยให้นักพัฒนาแอป Google Cloud แบบไร้เซิร์ฟเวอร์ปรับปรุงแอปพลิเคชันให้ทันสมัยโดยแนะนำการย้ายข้อมูลอย่างน้อย 1 รายการ ซึ่งส่วนใหญ่เป็นการย้ายข้อมูลออกจากบริการเดิม การทำเช่นนี้จะทำให้แอปของคุณพกพาได้มากขึ้น และช่วยให้คุณมีตัวเลือกและความยืดหยุ่นมากขึ้น ซึ่งจะช่วยให้คุณผสานรวมและเข้าถึงผลิตภัณฑ์ระบบคลาวด์ที่หลากหลายยิ่งขึ้น รวมถึงอัปเกรดเป็นภาษาเวอร์ชันใหม่ๆ ได้ง่ายขึ้น แม้ว่าในตอนแรกจะมุ่งเน้นไปที่ผู้ใช้ Cloud รุ่นแรกๆ ซึ่งส่วนใหญ่เป็นนักพัฒนาซอฟต์แวร์ App Engine (สภาพแวดล้อมมาตรฐาน) แต่ชุดข้อมูลนี้ก็ครอบคลุมแพลตฟอร์มแบบไร้เซิร์ฟเวอร์อื่นๆ เช่น Cloud Functions และ Cloud Run หรือที่อื่นๆ หากเกี่ยวข้อง

Codelab นี้มีจุดประสงค์เพื่อแสดงให้นักพัฒนาแอป App Engine ที่ใช้ Python 2 ทราบวิธีย้ายข้อมูลจากงานแบบดึงของคิวงาน App Engine ไปยัง Cloud Pub/Sub นอกจากนี้ ยังมีการย้ายข้อมูลโดยนัยจาก App Engine NDB ไปยัง Cloud NDB สำหรับการเข้าถึง Datastore (ซึ่งจะกล่าวถึงในโมดูลที่ 2 เป็นหลัก) รวมถึงการอัปเกรดเป็น Python 3

ในโมดูลที่ 18 คุณจะได้เรียนรู้วิธีเพิ่มการใช้งานงาน pull ในแอปของคุณ ในโมดูลนี้ คุณจะนำแอปโมดูลที่ 18 ที่สร้างเสร็จแล้วมาใช้และย้ายข้อมูลการใช้งานนั้นไปยัง Cloud Pub/Sub ผู้ที่ใช้คิวงานสำหรับงานพุชจะย้ายข้อมูลไปยัง Cloud Tasks แทน และควรดูโมดูล 7-9 แทน

คุณจะได้เรียนรู้วิธีต่อไปนี้

สิ่งที่คุณต้องมี

แบบสำรวจ

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านอย่างเดียว อ่านและทำแบบฝึกหัดให้เสร็จ

คุณจะให้คะแนนประสบการณ์การใช้งาน Python เท่าใด

ผู้ฝึกหัด ขั้นกลาง ผู้ชำนาญ

คุณจะให้คะแนนประสบการณ์การใช้บริการ Google Cloud เท่าใด

ผู้ฝึกหัด ขั้นกลาง ผู้ชำนาญ

2. ฉากหลัง

คิวงานของ App Engine รองรับทั้งงานแบบพุชและแบบดึง Google Cloud ขอแนะนำให้ย้ายข้อมูลจากบริการแบบแพ็กเกจเดิม เช่น Task Queue ไปยังบริการอื่นๆ แบบสแตนด์อโลนในระบบคลาวด์หรือบริการเทียบเท่าของบุคคลที่สาม เพื่อปรับปรุงความสามารถในการพกพาของแอปพลิเคชัน

โมดูลการย้ายข้อมูล 7-9 ครอบคลุมการย้ายข้อมูลงานแบบพุช ส่วนโมดูล 18-19 เน้นการย้ายข้อมูลงานแบบดึง แม้ว่า Cloud Tasks จะจับคู่กับงานแบบพุชของคิวงานได้ใกล้เคียงกว่า แต่ Pub/Sub ก็ไม่ได้เป็นอะนาล็อกที่ใกล้เคียงกับงานแบบดึงของคิวงาน

Pub/Sub มีฟีเจอร์มากกว่าฟังก์ชันการดึงข้อมูลที่คิวงานมีให้ ตัวอย่างเช่น Pub/Sub มีฟังก์ชันการทำงานแบบพุชด้วย แต่ Cloud Tasks จะคล้ายกับงานพุชของคิวงานมากกว่า ดังนั้นพุชของ Pub/Sub จึงไม่ครอบคลุมอยู่ในโมดูลการย้ายข้อมูลใดๆ Codelab โมดูลที่ 19 นี้แสดงให้เห็นถึงการเปลี่ยนกลไกการจัดคิวจากคิวงานแบบดึงของคิวงานเป็น Pub/Sub รวมถึงการย้ายข้อมูลจาก NDB ของ App Engine ไปยัง Cloud NDB สำหรับการเข้าถึง Datastore ซึ่งเป็นการทำซ้ำการย้ายข้อมูลโมดูลที่ 2

แม้ว่าโค้ดของโมดูล 18 จะ "โฆษณา" เป็นแอปตัวอย่าง Python 2 แต่แหล่งที่มานั้นเข้ากันได้กับ Python 2 และ 3 และยังคงเป็นเช่นนั้นแม้หลังจากย้ายข้อมูลไปยัง Cloud Pub/Sub (และ Cloud NDB) ในโมดูล 19 นี้

บทแนะนำนี้มีขั้นตอนต่อไปนี้

  1. การตั้งค่า/การเตรียมการ
  2. อัปเดตการกำหนดค่า
  3. แก้ไขโค้ดแอปพลิเคชัน

3. การตั้งค่า/การเตรียมการ

ส่วนนี้จะอธิบายวิธี

  1. ตั้งค่าโปรเจ็กต์ Cloud
  2. รับแอปตัวอย่างพื้นฐาน
  3. (อีกครั้ง) นำไปใช้งานและตรวจสอบแอปพื้นฐาน
  4. เปิดใช้บริการ/API ใหม่ของ Google Cloud

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

1. ตั้งค่าโปรเจ็กต์

หากทำ Codelab โมดูลที่ 18 เสร็จแล้ว ให้ใช้โปรเจ็กต์ (และโค้ด) เดียวกันนั้นซ้ำ หรือจะสร้างโปรเจ็กต์ใหม่หรือนำโปรเจ็กต์อื่นที่มีอยู่มาใช้ซ้ำก็ได้ ตรวจสอบว่าโปรเจ็กต์มีบัญชีสำหรับการเรียกเก็บเงินที่ใช้งานอยู่และแอป App Engine ที่เปิดใช้แล้ว ค้นหารหัสโปรเจ็กต์เนื่องจากคุณจะต้องใช้รหัสนี้ในระหว่าง Codelab นี้ โดยใช้รหัสเมื่อใดก็ตามที่พบตัวแปร PROJECT_ID

2. รับแอปตัวอย่างพื้นฐาน

ข้อกำหนดเบื้องต้นอย่างหนึ่งคือแอป App Engine ของโมดูลที่ 18 ที่ใช้งานได้ ดังนั้นให้ทำ Codelab ให้เสร็จ (แนะนำ ลิงก์ด้านบน) หรือคัดลอกโค้ดโมดูลที่ 18 จากที่เก็บ ไม่ว่าคุณจะใช้ของคุณเองหรือของเรา เราจะเริ่มจากตรงนี้ ("START") Codelab นี้จะแนะนำขั้นตอนการย้ายข้อมูลให้คุณ โดยจะจบด้วยโค้ดที่คล้ายกับโค้ดในโฟลเดอร์ที่เก็บของโมดูล 19 ("FINISH")

ไม่ว่าคุณจะใช้แอป Module 18 ใด โฟลเดอร์ควรมีลักษณะดังด้านล่างนี้ และอาจมีโฟลเดอร์ lib ด้วย

$ ls
README.md               appengine_config.py     queue.yaml              templates
app.yaml                main.py                 requirements.txt

3. (อีกครั้ง) นำไปใช้งานและตรวจสอบแอปพื้นฐาน

ทำตามขั้นตอนต่อไปนี้เพื่อติดตั้งใช้งานแอป Module 18

  1. ลบโฟลเดอร์ lib หากมี แล้วเรียกใช้ pip install -t lib -r requirements.txt เพื่อสร้าง lib ใหม่ คุณอาจต้องใช้ pip2 แทนหากติดตั้งทั้ง Python 2 และ 3 ไว้ในคอมพิวเตอร์สำหรับการพัฒนาซอฟต์แวร์
  2. ตรวจสอบว่าคุณได้ติดตั้งและเริ่มต้นเครื่องมือบรรทัดคำสั่ง gcloud รวมถึงได้อ่านการใช้งานแล้ว
  3. (ไม่บังคับ) ตั้งค่าโปรเจ็กต์ Cloud ด้วย gcloud config set project PROJECT_ID หากไม่ต้องการป้อน PROJECT_ID กับคำสั่ง gcloud แต่ละคำสั่งที่คุณออก
  4. ทำให้แอปตัวอย่างใช้งานได้ด้วย gcloud app deploy
  5. ยืนยันว่าแอปทำงานได้ตามที่คาดไว้โดยไม่มีปัญหา หากคุณทำ Codelab โมดูลที่ 18 เสร็จแล้ว แอปจะแสดงผู้เข้าชมยอดนิยมพร้อมกับการเข้าชมล่าสุด (ดังภาพด้านล่าง) หากไม่เป็นเช่นนั้น อาจไม่มีจำนวนผู้เข้าชมที่จะแสดง

b667551dcbab1a09.png

ก่อนที่จะย้ายข้อมูลแอปตัวอย่างของโมดูล 18 คุณต้องเปิดใช้บริการระบบคลาวด์ที่แอปที่แก้ไขแล้วจะใช้ก่อน

4. เปิดใช้บริการ/API ใหม่ของ Google Cloud

แอปเวอร์ชันเก่าใช้บริการที่รวมไว้ของ App Engine ซึ่งไม่จำเป็นต้องตั้งค่าเพิ่มเติม แต่บริการ Cloud แบบสแตนด์อโลนต้องตั้งค่าเพิ่มเติม และแอปที่อัปเดตแล้วจะใช้ทั้ง Cloud Pub/Sub และ Cloud Datastore (ผ่านไลบรารีของไคลเอ็นต์ Cloud NDB) App Engine และ Cloud API ทั้ง 2 รายการมีโควต้าระดับ "ฟรีตลอด" และตราบใดที่คุณยังคงอยู่ภายใต้ขีดจำกัดเหล่านั้น คุณก็ไม่ควรมีค่าใช้จ่ายในการทำบทแนะนำนี้ให้เสร็จสมบูรณ์ คุณเปิดใช้ Cloud API ได้จาก Cloud Console หรือจากบรรทัดคำสั่งก็ได้ ขึ้นอยู่กับความต้องการ

จาก Cloud Console

ไปที่หน้าคลังของ API Manager (สำหรับโปรเจ็กต์ที่ถูกต้อง) ใน Cloud Console แล้วค้นหา API ของ Cloud Datastore และ Cloud Pub/Sub โดยใช้แถบค้นหาตรงกลางหน้า

c7a740304e9d35b.png

คลิกปุ่มเปิดใช้สำหรับแต่ละ API แยกกัน ระบบอาจแจ้งให้คุณระบุข้อมูลการเรียกเก็บเงิน ตัวอย่างเช่น นี่คือหน้าไลบรารี Cloud Pub/Sub API

1b6c0a2a73124f6b.jpeg

จากบรรทัดคำสั่ง

แม้ว่าการเปิดใช้ API จากคอนโซลจะให้ข้อมูลที่เป็นภาพ แต่บางคนก็อาจชอบใช้บรรทัดคำสั่งมากกว่า ออกคำสั่ง gcloud services enable pubsub.googleapis.com datastore.googleapis.com เพื่อเปิดใช้ทั้ง 2 API พร้อมกัน

$ gcloud services enable pubsub.googleapis.com datastore.googleapis.com
Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

ระบบอาจแจ้งให้คุณระบุข้อมูลสำหรับการเรียกเก็บเงิน หากต้องการเปิดใช้ Cloud API อื่นๆ และต้องการทราบ URI ของ API เหล่านั้น คุณจะดูได้ที่ด้านล่างของหน้าไลบรารีของแต่ละ API เช่น ดู pubsub.googleapis.com เป็น "ชื่อบริการ" ที่ด้านล่างของหน้า Pub/Sub ด้านบน

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

4. สร้างทรัพยากร Pub/Sub

สรุปคำสั่งลำดับของเวิร์กโฟลว์คิวของงานจากโมดูลที่ 18

  1. โมดูล 18 ใช้ไฟล์ queue.yaml เพื่อสร้างคิวแบบดึงชื่อ pullq
  2. แอปจะเพิ่มงานไปยังคิวแบบดึงเพื่อติดตามผู้เข้าชม
  3. ในที่สุดผู้ปฏิบัติงานจะประมวลผลงาน โดยจะมีการเช่าผู้ปฏิบัติงานเป็นระยะเวลาที่แน่นอน (1 ชั่วโมง)
  4. ระบบจะเรียกใช้งานเพื่อรวบรวมจำนวนผู้เข้าชมล่าสุด
  5. ระบบจะลบงานออกจากคิวเมื่อเสร็จสิ้น

คุณจะจำลองเวิร์กโฟลว์ที่คล้ายกันด้วย Pub/Sub ส่วนถัดไปจะแนะนำคำศัพท์พื้นฐานของ Pub/Sub พร้อมวิธีต่างๆ 3 วิธีในการสร้างทรัพยากร Pub/Sub ที่จำเป็น

คำศัพท์ของคิวงาน App Engine (ดึง) เทียบกับ Cloud Pub/Sub

การเปลี่ยนไปใช้ Pub/Sub ต้องมีการปรับคำศัพท์เล็กน้อย ด้านล่างนี้คือหมวดหมู่หลักพร้อมกับคำที่เกี่ยวข้องจากทั้ง 2 ผลิตภัณฑ์ นอกจากนี้ โปรดอ่านคำแนะนำในการย้ายข้อมูลซึ่งมีการเปรียบเทียบที่คล้ายกัน

  • โครงสร้างข้อมูลการจัดคิว: เมื่อใช้คิวของงาน ข้อมูลจะไปอยู่ในคิวแบบดึง ส่วนเมื่อใช้ Pub/Sub ข้อมูลจะไปอยู่ในหัวข้อ
  • หน่วยของข้อมูลที่จัดคิว: งานแบบดึงข้อมูลที่มีคิวงานเรียกว่าข้อความที่มี Pub/Sub
  • โปรเซสเซอร์ข้อมูล: Task Queue ช่วยให้Worker เข้าถึงงานแบบดึงได้ ส่วน Pub/Sub จะต้องมีการสมัครใช้บริการ/ผู้สมัครใช้บริการเพื่อรับข้อความ
  • การดึงข้อมูล: การเช่างานแบบดึงจะเหมือนกับการดึงข้อความจากหัวข้อ (ผ่านการสมัครใช้บริการ)
  • การล้างข้อมูล/การดำเนินการให้เสร็จสมบูรณ์: การลบงานในคิวของ Task Queue ออกจากคิวแบบดึงเมื่อคุณดำเนินการเสร็จแล้วจะคล้ายกับการรับทราบข้อความ Pub/Sub

แม้ว่าการจัดคิวการเปลี่ยนแปลงผลิตภัณฑ์จะเปลี่ยนไป แต่ขั้นตอนการทำงานจะยังคงคล้ายกัน

  1. แอปจะใช้หัวข้อชื่อ pullq แทนคิวแบบดึง
  2. แอปจะส่งข้อความไปยังหัวข้อ (pullq) แทนที่จะเพิ่มงานลงในคิวแบบดึง
  3. แทนที่จะให้ Worker เช่าชื่องานจากคิวแบบดึง Subscriber ชื่อ worker จะดึงข้อความจากหัวข้อ pullq
  4. แอปจะประมวลผลเพย์โหลดของข้อความ โดยเพิ่มจำนวนผู้เข้าชมใน Datastore
  5. แอปจะรับทราบข้อความที่ประมวลผลแล้วแทนที่จะลบงานออกจากคิวแบบดึง

การตั้งค่าคิวงานเกี่ยวข้องกับการสร้างคิวแบบดึง เมื่อใช้ Pub/Sub การตั้งค่าจะต้องสร้างทั้งหัวข้อและการสมัครใช้บริการ ในโมดูลที่ 18 เราได้ประมวลผล queue.yaml นอกการเรียกใช้แอป ตอนนี้เราต้องทำแบบเดียวกันกับ Pub/Sub

คุณสร้างหัวข้อและการสมัครใช้บริการได้ 3 วิธี ดังนี้

  1. จากคอนโซล Google Cloud
  2. จากบรรทัดคำสั่ง หรือ
  3. จากโค้ด (สคริปต์ Python แบบสั้น)

เลือกตัวเลือกใดตัวเลือกหนึ่งด้านล่างและทําตามวิธีการที่เกี่ยวข้องเพื่อสร้างทรัพยากร Pub/Sub

จากคอนโซล Google Cloud

หากต้องการสร้างหัวข้อจาก Cloud Console ให้ทำตามขั้นตอนต่อไปนี้

  1. ไปที่หน้าหัวข้อ Pub/Sub ใน Cloud Console
  2. คลิกสร้างหัวข้อที่ด้านบน จากนั้นหน้าต่างกล่องโต้ตอบใหม่จะเปิดขึ้น (ดูรูปภาพด้านล่าง)
  3. ป้อน pullq ในช่องรหัสหัวข้อ
  4. ยกเลิกการเลือกตัวเลือกที่เลือกไว้ทั้งหมด แล้วเลือกคีย์การเข้ารหัสที่จัดการใน Google
  5. คลิกปุ่มสร้างหัวข้อ

กล่องโต้ตอบการสร้างหัวข้อจะมีลักษณะดังนี้

a05cfdbf64571ceb.png

เมื่อมีหัวข้อแล้ว คุณต้องสร้างการสมัครใช้บริการสำหรับหัวข้อนั้น โดยทำดังนี้

  1. ไปที่หน้าการสมัครใช้บริการ Pub/Sub ใน Cloud Console
  2. คลิกสร้างการสมัครใช้บริการที่ด้านบน (ดูรูปภาพด้านล่าง)
  3. ป้อน worker ในช่องรหัสการสมัครใช้บริการ
  4. เลือก pullq จากเมนูแบบเลื่อนลงเลือกหัวข้อ Cloud Pub/Sub โดยจดบันทึก "เส้นทางแบบเต็ม" เช่น projects/PROJECT_ID/topics/pullq
  5. เลือกดึงสำหรับประเภทการนำส่ง
  6. ปล่อยให้ตัวเลือกอื่นๆ ทั้งหมดเป็นค่าเริ่มต้น แล้วคลิกปุ่มสร้าง

หน้าจอการสร้างการสมัครใช้บริการจะมีลักษณะดังนี้

c5444375c20b0618.jpeg

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

จากบรรทัดคำสั่ง

ผู้ใช้ Pub/Sub สามารถสร้างหัวข้อและการสมัครใช้บริการด้วยคำสั่ง gcloud pubsub topics create TOPIC_ID และ gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic=TOPIC_ID ตามลำดับ การดำเนินการเหล่านี้ด้วย TOPIC_ID ของ pullq และ SUBSCRIPTION_ID ของ worker จะส่งผลให้เอาต์พุตของโปรเจ็กต์ PROJECT_ID เป็นดังนี้

$ gcloud pubsub topics create pullq
Created topic [projects/PROJECT_ID/topics/pullq].

$ gcloud pubsub subscriptions create worker --topic=pullq
Created subscription [projects/PROJECT_ID/subscriptions/worker].

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

จากโค้ด (สคริปต์ Python แบบสั้น)

อีกวิธีหนึ่งในการสร้างหัวข้อและการสมัครรับข้อมูลโดยอัตโนมัติคือการใช้ Pub/Sub API ในซอร์สโค้ด ด้านล่างนี้คือโค้ดสำหรับสคริปต์ maker.py ในโฟลเดอร์ที่เก็บข้อมูลของโมดูล 19

from __future__ import print_function
import google.auth
from google.api_core import exceptions
from google.cloud import pubsub

_, PROJECT_ID = google.auth.default()
TOPIC = 'pullq'
SBSCR = 'worker'
ppc_client = pubsub.PublisherClient()
psc_client = pubsub.SubscriberClient()
TOP_PATH = ppc_client.topic_path(PROJECT_ID, TOPIC)
SUB_PATH = psc_client.subscription_path(PROJECT_ID, SBSCR)

def make_top():
    try:
        top = ppc_client.create_topic(name=TOP_PATH)
        print('Created topic %r (%s)' % (TOPIC, top.name))
    except exceptions.AlreadyExists:
        print('Topic %r already exists at %r' % (TOPIC, TOP_PATH))

def make_sub():
    try:
        sub = psc_client.create_subscription(name=SUB_PATH, topic=TOP_PATH)
        print('Subscription created %r (%s)' % (SBSCR, sub.name))
    except exceptions.AlreadyExists:
        print('Subscription %r already exists at %r' % (SBSCR, SUB_PATH))
    try:
        psc_client.close()
    except AttributeError:  # special Py2 handler for grpcio<1.12.0
        pass

make_top()
make_sub()

การเรียกใช้สคริปต์นี้จะทำให้เกิดเอาต์พุตที่คาดไว้ (หากไม่มีข้อผิดพลาด)

$ python3 maker.py
Created topic 'pullq' (projects/PROJECT_ID/topics/pullq)
Subscription created 'worker' (projects/PROJECT_ID/subscriptions/worker)

การเรียก API เพื่อสร้างทรัพยากรที่มีอยู่แล้วจะทำให้ไลบรารีของไคลเอ็นต์ส่งข้อยกเว้น google.api_core.exceptions.AlreadyExists ซึ่งสคริปต์จะจัดการอย่างเหมาะสม

$ python3 maker.py
Topic 'pullq' already exists at 'projects/PROJECT_ID/topics/pullq'
Subscription 'worker' already exists at 'projects/PROJECT_ID/subscriptions/worker'

หากเพิ่งเริ่มใช้ Pub/Sub โปรดดูข้อมูลเชิงลึกเพิ่มเติมในเอกสารประกอบเรื่องสถาปัตยกรรม Pub/Sub

5. อัปเดตการกำหนดค่า

การอัปเดตในการกำหนดค่ารวมถึงการเปลี่ยนไฟล์การกำหนดค่าต่างๆ รวมถึงการสร้างคิวแบบดึงของ App Engine ที่เทียบเท่ากัน แต่ภายในระบบนิเวศของ Cloud Pub/Sub

ลบ queue.yaml

เราจะเลิกใช้คิวของงานทั้งหมด ดังนั้นโปรดลบ queue.yaml เนื่องจาก Pub/Sub ไม่ได้ใช้ไฟล์นี้ คุณจะสร้างหัวข้อ Pub/Sub (และการสมัครใช้งาน) แทนการสร้างคิวแบบดึง

requirements.txt

ต่อท้ายทั้ง google-cloud-ndb และ google-cloud-pubsub ไปยัง requirements.txt เพื่อเข้าร่วม flask จากโมดูลที่ 18 ตอนนี้โมดูล 19 ที่อัปเดตแล้วrequirements.txtควรมีลักษณะดังนี้

flask
google-cloud-ndb
google-cloud-pubsub

requirements.txtไฟล์นี้ไม่มีหมายเลขเวอร์ชัน ซึ่งหมายความว่าระบบจะเลือกเวอร์ชันล่าสุด หากเกิดปัญหาความเข้ากันไม่ได้ ให้ทำตามแนวทางปฏิบัติมาตรฐานในการใช้หมายเลขเวอร์ชันเพื่อล็อกเวอร์ชันที่ใช้งานได้สำหรับแอป

app.yaml

การเปลี่ยนแปลงใน app.yaml จะแตกต่างกันไปขึ้นอยู่กับว่าคุณจะใช้ Python 2 ต่อไปหรืออัปเกรดเป็น Python 3

Python 2

การอัปเดต requirements.txt ข้างต้นจะเพิ่มการใช้ไลบรารีของไคลเอ็นต์ Google Cloud ซึ่งต้องได้รับการสนับสนุนเพิ่มเติมจาก App Engine ได้แก่ ไลบรารีในตัว setuptools และ grpcio การใช้ไลบรารีในตัวต้องมีส่วน libraries ใน app.yaml และหมายเลขเวอร์ชันของไลบรารี หรือ "ล่าสุด" สำหรับเวอร์ชันล่าสุดที่พร้อมใช้งานในเซิร์ฟเวอร์ App Engine โมดูล 18 app.yaml ยังไม่มีส่วนใดส่วนหนึ่งต่อไปนี้

ก่อน:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

เพิ่มlibrariesส่วนใน app.yaml พร้อมกับรายการสำหรับทั้ง setuptools และ grpcio โดยเลือกเวอร์ชันล่าสุด นอกจากนี้ ให้เพิ่มรายการruntimeตัวยึดตำแหน่งสำหรับ Python 3 โดยใส่ความคิดเห็นพร้อมกับรุ่น 3.x ปัจจุบัน เช่น 3.10 ในขณะที่เขียน การเปลี่ยนแปลงเหล่านี้จะทำให้ app.yaml มีลักษณะดังนี้

หลังจากนั้น

#runtime: python310
runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

libraries:
- name: setuptools
  version: latest
- name: grpcio
  version: latest

Python 3

สำหรับผู้ใช้ Python 3 และ app.yaml การลบสิ่งต่างๆ ออกเป็นเรื่องสำคัญ ในส่วนนี้ คุณจะลบhandlers ส่วน threadsafe และ api_version คำสั่ง และจะไม่สร้างlibraries ส่วน

รันไทม์รุ่นที่ 2 ไม่มีไลบรารีของบุคคลที่สามในตัว จึงไม่จำเป็นต้องมีส่วน libraries ใน app.yaml นอกจากนี้ คุณไม่จำเป็นต้องคัดลอก (บางครั้งเรียกว่าการจัดหาหรือการรวมแพ็กเกจด้วยตนเอง) แพ็กเกจของบุคคลที่สามที่ไม่ได้ติดตั้งมาพร้อมกับระบบอีกต่อไป คุณต้องระบุเฉพาะไลบรารีของบุคคลที่สามที่แอปใช้ใน requirements.txt

ส่วน handlers ใน app.yaml ใช้สำหรับระบุแฮนเดิลแอปพลิเคชัน (สคริปต์) และไฟล์แบบคงที่ เนื่องจากรันไทม์ Python 3 กําหนดให้เฟรมเวิร์กเว็บทําการกำหนดเส้นทางของตัวเอง จึงต้องเปลี่ยนตัวแฮนเดิลสคริปต์ทั้งหมดเป็น auto หากแอปของคุณ (เช่น Module 18) ไม่แสดงไฟล์แบบคงที่ เส้นทางทั้งหมดจะเป็น auto ซึ่งทำให้ไม่เกี่ยวข้อง ด้วยเหตุนี้ จึงไม่จำเป็นต้องมีส่วน handlers ด้วยเช่นกัน ดังนั้นให้ลบส่วนดังกล่าว

สุดท้ายนี้ ไม่มีการใช้ทั้งคำสั่ง threadsafe และ api_version ใน Python 3 ดังนั้นให้ลบคำสั่งเหล่านั้นออกด้วย สรุปคือคุณควรลบส่วนทั้งหมดของ app.yaml เพื่อให้เหลือเฉพาะคำสั่ง runtime ที่ระบุ Python 3 เวอร์ชันล่าสุด เช่น 3.10 app.yaml จะมีลักษณะดังนี้ก่อนและหลังการอัปเดต

ก่อน:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

หลังจากนั้น

runtime: python310

สำหรับผู้ที่ยังไม่พร้อมที่จะลบทุกอย่างออกจาก app.yaml สำหรับ Python 3 เราได้จัดเตรียมไฟล์app3.yamlทางเลือกไว้ในโฟลเดอร์ที่เก็บข้อมูลของโมดูล 19 หากต้องการใช้ไฟล์ดังกล่าวแทนสำหรับการติดตั้งใช้งาน ให้ต่อท้ายชื่อไฟล์นี้ที่ท้ายคำสั่ง: gcloud app deploy app3.yaml (มิฉะนั้น ระบบจะใช้ไฟล์ app.yaml ของ Python 2 ที่คุณไม่ได้เปลี่ยนแปลงเป็นค่าเริ่มต้นและติดตั้งใช้งานแอป)

appengine_config.py

หากอัปเกรดเป็น Python 3 คุณไม่จำเป็นต้องใช้ appengine_config.py ดังนั้นให้ลบออก เหตุผลที่คุณไม่จำเป็นต้องทำเช่นนั้นก็คือการรองรับไลบรารีของบุคคลที่สามนั้นกำหนดให้ระบุไลบรารีเหล่านั้นใน requirements.txt เท่านั้น หากคุณใช้ Python 2 โปรดอ่านต่อ

โมดูล 18 appengine_config.py มีโค้ดที่เหมาะสมเพื่อรองรับไลบรารีของบุคคลที่สาม เช่น Flask และไลบรารีของไคลเอ็นต์ Cloud ที่เพิ่งเพิ่มลงใน requirements.txt

ก่อน:

from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)

อย่างไรก็ตาม โค้ดนี้เพียงอย่างเดียวไม่เพียงพอที่จะรองรับไลบรารีในตัวที่เพิ่งเพิ่ม (setuptools, grpcio) คุณจะต้องเพิ่มโค้ดอีก 2-3 บรรทัด ดังนั้นให้อัปเดต appengine_config.py เพื่อให้มีลักษณะดังนี้

หลังจากนั้น

import pkg_resources
from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
# Add libraries to pkg_resources working set to find the distribution.
pkg_resources.working_set.add_entry(PATH)

ดูรายละเอียดเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงที่จำเป็นเพื่อรองรับไลบรารีของไคลเอ็นต์ Cloud ได้ในเอกสารประกอบเกี่ยวกับการย้ายข้อมูลบริการแบบแพ็กเกจ

การอัปเดตการกำหนดค่าอื่นๆ

หากมีโฟลเดอร์ lib ให้ลบออก หากคุณเป็นผู้ใช้ Python 2 ให้เติมข้อมูลในโฟลเดอร์ lib โดยใช้คำสั่งต่อไปนี้

pip install -t lib -r requirements.txt  # or pip2

หากติดตั้งทั้ง Python 2 และ 3 ในระบบพัฒนา คุณอาจต้องใช้ pip2 แทน pip

6. แก้ไขโค้ดแอปพลิเคชัน

ส่วนนี้มีการอัปเดตไฟล์แอปพลิเคชันหลัก main.py โดยแทนที่การใช้คิวแบบดึงของ App Engine Task Queue ด้วย Cloud Pub/Sub ไม่มีการเปลี่ยนแปลงเทมเพลตเว็บ templates/index.html ทั้ง 2 แอปควรทำงานเหมือนกันและแสดงข้อมูลเดียวกัน

อัปเดตการนำเข้าและการเริ่มต้น

การอัปเดตการนำเข้าและการเริ่มต้นมีดังนี้

  1. สำหรับการนำเข้า ให้แทนที่ App Engine NDB และคิวงานด้วย Cloud NDB และ Pub/Sub
  2. เปลี่ยนชื่อ pullq จากชื่อ QUEUE เป็นชื่อ TOPIC
  3. สำหรับงานแบบดึง ผู้ปฏิบัติงานจะเช่าเป็นเวลา 1 ชั่วโมง แต่สำหรับ Pub/Sub การหมดเวลาจะวัดตามข้อความแต่ละรายการ ดังนั้นให้ลบค่าคงที่ HOUR ออก
  4. Cloud API กำหนดให้ใช้ไคลเอ็นต์ API ดังนั้นให้เริ่มต้นใช้งานสำหรับ Cloud NDB และ Cloud Pub/Sub โดยที่ Cloud Pub/Sub จะมีไคลเอ็นต์สำหรับทั้งหัวข้อและการสมัครใช้บริการ
  5. Pub/Sub ต้องใช้รหัสโปรเจ็กต์ Cloud ดังนั้นให้นำเข้าและรับรหัสจาก google.auth.default()
  6. Pub/Sub กำหนดให้ใช้ "ชื่อเส้นทางแบบเต็ม" สำหรับหัวข้อและการสมัครใช้บริการ ดังนั้นให้สร้างโดยใช้*_path()ฟังก์ชันอำนวยความสะดวก

ด้านล่างนี้คือการนำเข้าและการเริ่มต้นจากโมดูลที่ 18 ตามด้วยลักษณะที่ส่วนต่างๆ ควรเป็นหลังจากใช้การเปลี่ยนแปลงข้างต้น โดยโค้ดใหม่ส่วนใหญ่จะเป็นทรัพยากร Pub/Sub ต่างๆ

ก่อน:

from flask import Flask, render_template, request
from google.appengine.api import taskqueue
from google.appengine.ext import ndb

HOUR = 3600
LIMIT = 10
TASKS = 1000
QNAME = 'pullq'
QUEUE = taskqueue.Queue(QNAME)
app = Flask(__name__)

หลังจากนั้น

from flask import Flask, render_template, request
import google.auth
from google.cloud import ndb, pubsub

LIMIT = 10
TASKS = 1000
TOPIC = 'pullq'
SBSCR = 'worker'

app = Flask(__name__)
ds_client  = ndb.Client()
ppc_client = pubsub.PublisherClient()
psc_client = pubsub.SubscriberClient()
_, PROJECT_ID = google.auth.default()
TOP_PATH = ppc_client.topic_path(PROJECT_ID, TOPIC)
SUB_PATH = psc_client.subscription_path(PROJECT_ID, SBSCR)

การอัปเดตโมเดลข้อมูลการเข้าชม

โมเดลข้อมูล Visit จะไม่เปลี่ยนแปลง การเข้าถึง Datastore ต้องใช้เครื่องมือจัดการบริบทไคลเอ็นต์ Cloud NDB API อย่างชัดเจน ds_client.context() ในโค้ด หมายความว่าคุณต้องรวมการเรียก Datastore ไว้ทั้งใน store_visit() และ fetch_visits() ภายในบล็อก with ของ Python การอัปเดตนี้เหมือนกับที่กล่าวถึงในโมดูลที่ 2

การเปลี่ยนแปลงที่เกี่ยวข้องมากที่สุดสำหรับ Pub/Sub คือการแทนที่การจัดคิวของงานดึงข้อมูลของคิวงานด้วยการเผยแพร่ข้อความ Pub/Sub ไปยังหัวข้อ pullq ด้านล่างนี้คือโค้ดก่อนและหลังทำการอัปเดตเหล่านี้

ก่อน:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit in Datastore and queue request to bump visitor count'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
    QUEUE.add(taskqueue.Task(payload=remote_addr, method='PULL'))

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

หลังจากนั้น

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit in Datastore and queue request to bump visitor count'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
    ppc_client.publish(TOP_PATH, remote_addr.encode('utf-8'))

def fetch_visits(limit):
    'get most recent visits'
    with ds_client.context():
        return Visit.query().order(-Visit.timestamp).fetch(limit)

การอัปเดตโมเดลข้อมูล VisitorCount

VisitorCount โมเดลข้อมูลจะไม่เปลี่ยนแปลงและจะfetch_counts() ยกเว้นการรวมการค้นหา Datastore ไว้ในบล็อก with ดังที่แสดงด้านล่าง

ก่อน:

class VisitorCount(ndb.Model):
    visitor = ndb.StringProperty(repeated=False, required=True)
    counter = ndb.IntegerProperty()

def fetch_counts(limit):
    'get top visitors'
    return VisitorCount.query().order(-VisitorCount.counter).fetch(limit)

หลังจากนั้น

class VisitorCount(ndb.Model):
    visitor = ndb.StringProperty(repeated=False, required=True)
    counter = ndb.IntegerProperty()

def fetch_counts(limit):
    'get top visitors'
    with ds_client.context():
        return VisitorCount.query().order(-VisitorCount.counter).fetch(limit)

อัปเดตรหัสผู้ปฏิบัติงาน

โค้ดของ Worker จะได้รับการอัปเดตโดยการแทนที่ NDB ด้วย Cloud NDB และคิวงานด้วย Pub/Sub แต่เวิร์กโฟลว์จะยังคงเหมือนเดิม

  1. ห่อหุ้มการเรียก Datastore ในบล็อกเครื่องมือจัดการบริบท Cloud NDB with
  2. การล้างคิวของ Task เกี่ยวข้องกับการลบงานทั้งหมดออกจากคิวแบบดึง Pub/Sub จะรวบรวม "รหัสการรับทราบ" ใน acks จากนั้นจะลบ/รับทราบเมื่อสิ้นสุด
  3. ระบบจะเช่าพุลงานของคิวงานในลักษณะเดียวกับการดึงข้อความ Pub/Sub แม้ว่าการลบงานแบบดึงจะดำเนินการกับออบเจ็กต์ของงานเอง แต่ข้อความ Pub/Sub จะถูกลบผ่านรหัสการรับทราบ
  4. เพย์โหลดของข้อความ Pub/Sub ต้องใช้ไบต์ (ไม่ใช่สตริง Python) ดังนั้นจึงมีการเข้ารหัสและถอดรหัส UTF-8 เมื่อเผยแพร่และดึงข้อความจากหัวข้อตามลำดับ

แทนที่ log_visitors() ด้วยโค้ดที่อัปเดตแล้วด้านล่างนี้เพื่อใช้การเปลี่ยนแปลงที่อธิบายไว้ข้างต้น

ก่อน:

@app.route('/log')
def log_visitors():
    'worker processes recent visitor counts and updates them in Datastore'
    # tally recent visitor counts from queue then delete those tasks
    tallies = {}
    tasks = QUEUE.lease_tasks(HOUR, TASKS)
    for task in tasks:
        visitor = task.payload
        tallies[visitor] = tallies.get(visitor, 0) + 1
    if tasks:
        QUEUE.delete_tasks(tasks)

    # increment those counts in Datastore and return
    for visitor in tallies:
        counter = VisitorCount.query(VisitorCount.visitor == visitor).get()
        if not counter:
            counter = VisitorCount(visitor=visitor, counter=0)
            counter.put()
        counter.counter += tallies[visitor]
        counter.put()
    return 'DONE (with %d task[s] logging %d visitor[s])\r\n' % (
            len(tasks), len(tallies))

หลังจากนั้น

@app.route('/log')
def log_visitors():
    'worker processes recent visitor counts and updates them in Datastore'
    # tally recent visitor counts from queue then delete those tasks
    tallies = {}
    acks = set()
    rsp = psc_client.pull(subscription=SUB_PATH, max_messages=TASKS)
    msgs = rsp.received_messages
    for rcvd_msg in msgs:
        acks.add(rcvd_msg.ack_id)
        visitor = rcvd_msg.message.data.decode('utf-8')
        tallies[visitor] = tallies.get(visitor, 0) + 1
    if acks:
        psc_client.acknowledge(subscription=SUB_PATH, ack_ids=acks)
    try:
        psc_client.close()
    except AttributeError:  # special handler for grpcio<1.12.0
        pass

    # increment those counts in Datastore and return
    if tallies:
        with ds_client.context():
            for visitor in tallies:
                counter = VisitorCount.query(VisitorCount.visitor == visitor).get()
                if not counter:
                    counter = VisitorCount(visitor=visitor, counter=0)
                    counter.put()
                counter.counter += tallies[visitor]
                counter.put()
    return 'DONE (with %d task[s] logging %d visitor[s])\r\n' % (
            len(msgs), len(tallies))

ไม่มีการเปลี่ยนแปลงแฮนเดิลแอปพลิเคชันหลัก root() นอกจากนี้ คุณไม่จำเป็นต้องเปลี่ยนแปลงไฟล์เทมเพลต HTML, templates/index.html ด้วยเช่นกัน ซึ่งจะครอบคลุมการอัปเดตที่จำเป็นทั้งหมด ขอแสดงความยินดีที่คุณได้มาถึงการสมัคร Module 19 ใหม่โดยใช้ Cloud Pub/Sub

7. สรุป/ล้างข้อมูล

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

ทำให้แอปพลิเคชันใช้งานได้และยืนยัน

ตรวจสอบว่าคุณได้สร้างหัวข้อ pullq และการสมัครใช้บริการ worker แล้ว หากดำเนินการดังกล่าวเสร็จแล้วและแอปตัวอย่างพร้อมใช้งาน ให้ติดตั้งใช้งานแอปด้วย gcloud app deploy เอาต์พุตควรเหมือนกับแอปในโมดูลที่ 18 ยกเว้นว่าคุณได้แทนที่กลไกการจัดคิวพื้นฐานทั้งหมดเรียบร้อยแล้ว

b667551dcbab1a09.png

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

คุณสามารถดำเนินการนี้ได้ด้วยบริการแบ็กเอนด์ของ App Engine, งาน cron, การเรียกดู /log หรือการออกคำขอ HTTP ในบรรทัดคำสั่ง ต่อไปนี้คือตัวอย่างการเรียกใช้และออกจากโค้ด Worker ด้วย curl (แทนที่ PROJECT_ID ของคุณ)

$ curl https://PROJECT_ID.appspot.com/log
DONE (with 1 task[s] logging 1 visitor[s])

จากนั้นจำนวนที่อัปเดตแล้วจะแสดงในการเข้าชมเว็บไซต์ครั้งถัดไป เท่านี้ก็เรียบร้อย

ล้างข้อมูล

ทั่วไป

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

เพื่อความโปร่งใสอย่างเต็มที่ การติดตั้งใช้งานแพลตฟอร์มการประมวลผลแบบ Serverless ของ Google Cloud เช่น App Engine จะทำให้เกิดค่าใช้จ่ายในการสร้างและพื้นที่เก็บข้อมูลเล็กน้อย Cloud Build มีโควต้าฟรีของตัวเอง เช่นเดียวกับ Cloud Storage การจัดเก็บรูปภาพนั้นจะใช้โควต้าบางส่วน อย่างไรก็ตาม คุณอาจอาศัยอยู่ในภูมิภาคที่ไม่มีระดับการใช้งานฟรีดังกล่าว ดังนั้นโปรดทราบการใช้พื้นที่เก็บข้อมูลเพื่อลดค่าใช้จ่ายที่อาจเกิดขึ้น "โฟลเดอร์" ของ Cloud Storage ที่คุณควรตรวจสอบ ได้แก่

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • ลิงก์พื้นที่เก็บข้อมูลด้านบนจะขึ้นอยู่กับPROJECT_IDและ *LOC*ation ของคุณ เช่น "us" หากแอปโฮสต์อยู่ในสหรัฐอเมริกา

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

เฉพาะสำหรับ Codelab นี้

บริการที่ระบุไว้ด้านล่างเป็นบริการเฉพาะสำหรับโค้ดแล็บนี้ ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบของแต่ละผลิตภัณฑ์

  • คอมโพเนนต์ต่างๆ ของ Cloud Pub/Sub มีระดับฟรี โปรดพิจารณาการใช้งานโดยรวมเพื่อทำความเข้าใจผลกระทบด้านต้นทุนได้ดียิ่งขึ้น และดูรายละเอียดเพิ่มเติมได้ที่หน้าการกำหนดราคา
  • บริการ App Engine Datastore ให้บริการโดย Cloud Datastore (Cloud Firestore ในโหมด Datastore) ซึ่งมีระดับฟรีด้วย ดูข้อมูลเพิ่มเติมได้ที่หน้าการกำหนดราคา

ขั้นตอนถัดไป

นอกเหนือจากบทแนะนำนี้ โมดูลการย้ายข้อมูลอื่นๆ ที่มุ่งเน้นการย้ายออกจากบริการแบบแพ็กเกจเดิมที่ควรพิจารณา ได้แก่

  • โมดูลที่ 2: ย้ายข้อมูลจาก App Engine ndb ไปยัง Cloud NDB
  • โมดูล 7-9: ย้ายข้อมูลจากคิวงานของ App Engine (งานแบบพุช) ไปยัง Cloud Tasks
  • โมดูล 12-13: ย้ายข้อมูลจาก Memcache ของ App Engine ไปยัง Cloud Memorystore
  • โมดูล 15-16: ย้ายข้อมูลจาก App Engine Blobstore ไปยัง Cloud Storage

App Engine ไม่ใช่แพลตฟอร์มแบบไร้เซิร์ฟเวอร์เพียงอย่างเดียวใน Google Cloud อีกต่อไป หากคุณมีแอป App Engine ขนาดเล็กหรือแอปที่มีฟังก์ชันการทำงานจำกัด และต้องการเปลี่ยนให้เป็นไมโครเซอร์วิสแบบสแตนด์อโลน หรือต้องการแยกแอปแบบ Monolithic ออกเป็นคอมโพเนนต์ที่นำกลับมาใช้ใหม่ได้หลายรายการ นี่เป็นเหตุผลที่ดีที่ควรพิจารณาเปลี่ยนไปใช้ Cloud Functions หากการใช้คอนเทนเนอร์กลายเป็นส่วนหนึ่งของเวิร์กโฟลว์การพัฒนาแอปพลิเคชัน โดยเฉพาะอย่างยิ่งหากประกอบด้วยไปป์ไลน์ CI/CD (การผสานรวมอย่างต่อเนื่อง/การนำส่งหรือการติดตั้งใช้งานอย่างต่อเนื่อง) ให้พิจารณาการย้ายข้อมูลไปยัง Cloud Run สถานการณ์เหล่านี้จะครอบคลุมในโมดูลต่อไปนี้

  • ย้ายข้อมูลจาก App Engine ไปยัง Cloud Functions: ดูโมดูลที่ 11
  • ย้ายข้อมูลจาก App Engine ไปยัง Cloud Run: ดูโมดูลที่ 4 เพื่อจัดคอนเทนเนอร์แอปด้วย Docker หรือโมดูลที่ 5 เพื่อดำเนินการโดยไม่ต้องใช้คอนเทนเนอร์ ความรู้เกี่ยวกับ Docker หรือ Dockerfile

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

ไม่ว่าคุณจะพิจารณาโมดูลการย้ายข้อมูลใดเป็นโมดูลถัดไป คุณจะเข้าถึงเนื้อหาของ Serverless Migration Station ทั้งหมด (Codelab, วิดีโอ, ซอร์สโค้ด [หากมี]) ได้ที่ที่เก็บแบบโอเพนซอร์ส README ของที่เก็บยังให้คำแนะนำเกี่ยวกับการย้ายข้อมูลที่ควรพิจารณาและ "ลำดับ" ที่เกี่ยวข้องของโมดูลการย้ายข้อมูลด้วย

8. แหล่งข้อมูลเพิ่มเติม

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

ปัญหา/ความคิดเห็นเกี่ยวกับ Codelabs

หากพบปัญหาเกี่ยวกับ Codelab นี้ โปรดค้นหาปัญหาของคุณก่อนที่จะยื่นเรื่อง ลิงก์สำหรับค้นหาและสร้างปัญหาใหม่

แหล่งข้อมูลเกี่ยวกับการย้ายข้อมูล

คุณจะพบลิงก์ไปยังโฟลเดอร์ที่เก็บสำหรับโมดูลที่ 18 (START) และโมดูลที่ 19 (FINISH) ได้ในตารางด้านล่าง

Codelab

Python 2

Python 3

โมดูล 18

รหัส

(ไม่มี)

โมดูล 19 (Codelab นี้)

รหัส

(เหมือนกับ Python 2 ยกเว้นใช้ app3.yaml เว้นแต่คุณจะอัปเดต app.yaml ตามที่กล่าวไว้ข้างต้น)

ข้อมูลอ้างอิงออนไลน์

แหล่งข้อมูลที่เกี่ยวข้องกับบทแนะนำนี้มีดังนี้

คิวงานของ App Engine

Cloud Pub/Sub

App Engine NDB และ Cloud NDB (Datastore)

แพลตฟอร์ม App Engine

ข้อมูลอื่นๆ เกี่ยวกับระบบคลาวด์

วิดีโอ

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป