หลีกเลี่ยงการเขียน Top level Python Code ใน Airflow DAG

Practice หนึ่งใน Airflow คือการหลีกเลี่ยงการเขียน Top level Python Code ใน DAG เป็นเพราะเนื่องจากการทำงานของ scheduler ที่จะคอยมา parse ไฟล์ DAG ของเราอยู่เรื่อย ๆ ดังนั้นถ้าเรามี code อะไรก็ตามที่อยู่ข้างนอก task หรือ function แล้ว ตอนที่ scheduler เข้ามา parse ไฟล์ มันก็จะ execute โค้ดนั้น ๆ ด้วย

ยกตัวอย่างง่าย ๆ ถ้าเรามีโค้ด DAG ประมาณนี้

conn = psycopg2.connect(
    database="db_name",
    host="db_host",
    user="db_user",
    password="db_pass",
    port="db_port",
)

with DAG( ... ):
    execute_something = PythonOperator( ... )

จะเกิดการ connect เข้าไปยัง Postgres database ทุกรอบที่ scheduler มาอ่านไฟล์ ซึ่งทำให้ performance ของ Airflow เราลดลงได้ ซ้ำยังมีปัญหาเรื่องการยิง connection เข้าไปที่ database อีก :sweat_smile:

ดังนั้นตรงนี้เราควรที่จะเอาไปเขียนใน function แล้วให้ operator อย่าง PythonOperator มาเรียก function นั้นแทน

แล้วก็เรื่อง import ก็เช่นกัน ตรงนี้น่าจะขัดใจ Python developer อยู่พอสมควร ตามรูปด้านล่างนี้

เพราะว่าการ import ที่ top level ทำให้เกิดโหลดขึ้นเยอะพอสมควร เค้าเลยแนะนำให้ไป import แบบ local หรือ import ใน function แทน

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

Reference: Top level Python Code

4 Likes