สถาปัตยกรรม Cosmic Story v2 — เจาะลึกแบบละเอียด

สำหรับวิศวกร PM นักข่าว และผู้มองหาพันธมิตร ครบทั้งกระบวนการ คอลเล็กชัน MongoDB ทั้ง 4 อีเวนต์ EDA ความเข้มงวดแบบ V-Model เป้าหมายด้านประสิทธิภาพ ความปลอดภัย และการเข้าถึง — รวมไว้ในหน้าเดียว

  • Soulwise-story เป็นโมดูล NestJS ตัวใหม่ที่ทำงานควบคู่กับโมดูล cosmic-story เดิม โดยมีการ import โดยตรงระหว่างฟีเจอร์โมดูลเป็น 0
  • ฐานข้อมูล MongoDB จำนวน 4 ชุด ได้แก่ soulwise_persons, soulwise_chapters, soulwise_journal_entries และ soulwise_resonances เนื้อหาเข้ารหัสด้วย AES-256 พร้อมจัดทำดัชนีให้เหมาะกับการค้นหาที่แต่ละชุดรองรับ
  • การสร้างแบบอะซิงโครนัสผ่านคิว BullMQ โดยหมดเวลาที่ 28 วินาที อีเวนต์จะถูกส่งผ่าน EventEmitter2 หลังจากคอมมิตฐานข้อมูลเท่านั้น — ไม่มีรายการกล่องขาเข้าที่หลอกตา
  • ข้อกำหนด V-Model: 119 ข้อ ไม่มีช่องว่าง เป้าหมายความครอบคลุมฝั่งแบ็กเอนด์ 85% ในระดับ statement บนเซอร์วิส ส่วนฝั่งฟรอนต์เอนด์ 90% บน Pinia stores

ท่อส่งข้อมูลอีกครั้ง พร้อมรายละเอียดทางวิศวกรรม

แต่ละขั้นตอนมีบริการ สัญญา และเหตุการณ์

  1. ทริกเกอร์

    การกระทำของผู้ใช้ — 'สร้างบทวันนี้ให้ซิสเตอร์' — หรือ cron ที่กำหนดไว้ เช่น สรุปประจำวันอาทิตย์เวลา 9 น. หรือรีเฟรชสภาพอากาศทุก 6 ชั่วโมง

  2. คิว

    งานจะถูกส่งไปยังคิว BullMQ ที่ชื่อว่า soulwise-chapter-generation โดยมีเวลาหมดเขตที่ 28 วินาที งานที่ใช้เวลานานจะถูกยกเลิกและรายงานกลับไปยังผู้ใช้ว่า 'กรุณาลองอีกครั้ง'

  3. เขียน

    ChapterGenerationService จะรวบรวมพรอมต์ 4 ปัจจัย ได้แก่ บริบทของบุคคล โหราศาสตร์ สัญญาณ และจังหวะ ให้เป็นอินพุต 1 เดียว ข้อมูลส่วนบุคคลดิบของผู้ใช้จะไม่ถูกใส่เข้าไปในพรอมต์ตรงๆ ทุกอย่างจะผ่านการกรองก่อนเสมอ

  4. สร้าง

    มีการเรียกใช้ผู้ให้บริการ AI ผ่านโทเค็นสัญลักษณ์ AI_GENERATION_ADAPTER — ซึ่งสามารถเปลี่ยนผู้ให้บริการได้ การตอบสนองจะถูกตรวจสอบความยาว รูปแบบ และความปลอดภัยก่อนดำเนินการต่อ

  5. ประมวลผลภายหลัง

    สี่สิ่งจะเกิดขึ้น: ตัวจำแนกภาวะวิกฤติจะตรวจหาถ้อยคำที่บ่งบอกวิกฤติ; ตัวดึงชิปแง่มุมจะคัดชิปโหราศาสตร์ออกมา 1 ถึง 3 ชิป; ตัวกรองป้องกันการอ้างสรรพคุณจะตัดถ้อยคำต้องห้ามออก; และเนื้อหาจะถูกเข้ารหัสแบบ AES-256 ด้วยกุญแจที่แพลตฟอร์มดูแลจัดการ

  6. คงอยู่

    ข้อมูลจะถูกบันทึกลงในคอลเลกชัน MongoDB ที่เหมาะสม ไม่ว่าจะเป็นบท บันทึกไดอารี หรือเรโซแนนซ์ พร้อมดัชนี userId และ personId เพื่อการค้นหาที่รวดเร็ว เริ่มจากการลบแบบชั่วคราวก่อน แล้วจึงลบข้อมูลส่วนบุคคล (PII) แบบถาวรเมื่อครบ 30 วัน

  7. แจ้งเตือน

    เหตุการณ์ EventEmitter2 — CHAPTER_COMPLETED, JOURNAL_CREATED — จะถูกเรียกหลังจากที่ฐานข้อมูลบันทึกข้อมูลเสร็จ โมดูลการแจ้งเตือนจะรับข้อมูลนี้ สร้างรายการในกล่องข้อความ และอาจส่งการแจ้งเตือนแบบพุช (จำกัดวันละหนึ่งครั้ง และเคารพช่วงเวลางดแจ้งเตือน)

  8. พื้นผิว

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

เจ็ดขั้นตอนจากจุดกระตุ้นสู่พื้นผิว แต่ละขั้นตั้งชื่อตามสิ่งที่มันทำจริง

ทั้ง 4 หมวดสะสม

จัดทำดัชนีสำหรับคำถามที่แต่ละข้อตอบ

soulwise_persons

รายการอัลบั้ม จัดทำดัชนีที่ userId, status, deletedAt ลบแบบชั่วคราวก่อน แล้วจึงลบข้อมูลส่วนบุคคลแบบถาวรเมื่อครบ 30 วัน

soulwise_chapters

บทที่เขียนโดย AI, เนื้อหาที่ถูกเข้ารหัส มีดัชนีบน personId, userId, generatedAt ชิปของมุมถูกจัดเก็บเป็นอาร์เรย์แยกต่างหากเพื่อการกรองที่รวดเร็ว

soulwise_journal_entries

ข้อความสะท้อนที่ผู้ใช้เขียน เนื้อหาที่เข้ารหัส มีดัชนีบน userId, personId, createdAt เนื้อหาที่ทำดัชนีข้อความเพื่อการค้นหา มีป้ายกำกับ 'ส่วนตัว — ห้ามป้อนให้ Luminara' ต่อรายการ

soulwise_resonances

คะแนน 4 มิติต่อความสัมพันธ์แต่ละคู่ ดัชนีเฉพาะบน personId คำนวณใหม่ผ่านการเรียกใช้บริการหลังจากเขียนบทหรือบันทึก

เหตุการณ์ EDA

กฎที่เคร่งครัด: เหตุการณ์จะถูกเรียกใช้หลังจากที่ฐานข้อมูลคอมมิตแล้วเท่านั้น การพึ่งพาข้ามโมดูลผ่านโทเค็นการฉีดสัญลักษณ์เท่านั้น ห้ามใช้ forwardRef โดยเด็ดขาด ไม่มีการนำเข้าโดยตรงระหว่างบริการกับบริการระหว่างโมดูลฟีเจอร์

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — ถูกเรียกหลังจากที่บทถูกเข้ารหัสและบันทึกแล้ว Notifications-v2 จะรับฟัง; สร้างรายการในกล่องข้อความ; และสามารถส่งการแจ้งเตือนแบบพุชได้
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — ถูกเรียกหลังจากที่บันทึกประจำวันถูกเข้ารหัสและบันทึกแล้ว บริการ Resonance จะรับฟังและเริ่มการคำนวณใหม่
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — ถูกเรียกหลังจากข้อมูลเกิดของบุคคลเปลี่ยนแปลง แคชของโหราศาสตร์ความสัมพันธ์จะถูกรีเซ็ต
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — ตามสัญญา notifications-v2; เคารพงบประมาณการแจ้งเตือนและช่วงเวลาที่เงียบ

ความเข้มงวดของข้อกำหนด V-Model

119 ข้อกำหนดที่ตรวจสอบย้อนกลับได้ ช่องว่างเป็นศูนย์ แต่ละข้อกำหนดเชื่อมโยงไปข้างหน้าสู่กรณีทดสอบ (UTP, ITP, STP, E2E) และย้อนกลับไปยัง user story 20 user stories 15 ข้อกำหนดเชิงฟังก์ชัน 12 หมวดหมู่ที่ไม่ใช่เชิงฟังก์ชัน 8 เกณฑ์การยอมรับระดับโกลบอล

สัญญาการแสดงผล

การสร้างบท 30 วินาทีหรือดีกว่าสำหรับ 95% ของคำขอ โดยวัดจากการกระจายระยะเวลาของงาน BullMQ API GET p99 มีเวลาแฝง 500 มิลลิวินาทีหรือดีกว่าที่ผู้ใช้พร้อมกัน 1,000 ราย โดยวัดจากการทดสอบโหลด k6 TTI ของฟรอนต์เอนด์ 3 วินาทีหรือดีกว่าบนเครือข่าย 4G ที่จำลอง โดยวัดผ่าน Lighthouse CI

สัญญาความปลอดภัย

การเข้ารหัส AES-256 สำหรับข้อมูลที่จัดเก็บ โดยใช้คีย์ที่ระบบจัดการสำหรับเนื้อหาของบันทึกและบทต่างๆ การส่งข้อมูลใช้ TLS 1.2+ พร้อมการเปลี่ยนเส้นทาง HTTP→HTTPS โทเค็นการเข้าถึงแบบ JWT มีอายุ 1 ชั่วโมง โทเค็นรีเฟรชมีอายุ 30 วัน และจะหมุนเวียนเมื่อมีการรีเฟรช การลบแบบนุ่มนวลมีระยะเวลา 30 วัน ก่อนที่จะลบข้อมูลส่วนบุคคลอย่างถาวร

สัญญาการเข้าถึง

prefers-reduced-motion ได้รับการเคารพในระดับสากล — แอนิเมชัน GSAP จะกลายเป็นเฟดแบบปรับความโปร่งใสเท่านั้น มีป้ายกำกับ VoiceOver และ TalkBack บนทุกองค์ประกอบที่โต้ตอบได้ ตรวจสอบด้วยตนเองบน iOS และ Android ก่อนการเผยแพร่แต่ละครั้ง

ทำไมต้องมีโมดูล soulwise-story แยกต่างหาก แทนที่จะขยาย cosmic-story?

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

ทำไมต้อง MongoDB ไม่ใช่ Postgres?

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

ทำไม BullMQ ถึงเป็นตัวเลือกคิวที่ดีที่สุด?

BullMQ ทำงานบน Redis ซึ่งมีอยู่ในระบบอยู่แล้วสำหรับ session และ rate-limit ไม่ต้องมีโครงสร้างพื้นฐานใหม่ มีระบบ retry, timeout และ observability ในตัวที่ครอบคลุมความต้องการในการสร้างบท โดยไม่ต้องเขียนระบบเอง

ข้อกำหนดต้นทางเขียนไว้ที่ไหนกันแน่?

พื้นที่เก็บข้อมูลภายใน ตัวเลขและสัญญาต่างๆ ในหน้านี้เป็นการถอดความจากสิ่งประดิษฐ์ V-Model ต้นทาง โพสต์บล็อกด้านวิศวกรรมที่เปิดเผยต่อสาธารณะบนคลัสเตอร์บล็อกของ My Zodiac AI (ติดแท็ก 'cosmic-story-v2') จะลงลึกในรายละเอียดเฉพาะของส่วนต่างๆ ของการสร้าง

ลองใช้ My Zodiac AI วันนี้

ขณะที่ Soulwise กำลังเปิดคลื่นของมัน แอปดูดวงเรือธงของเราก็อยู่ในมือคุณแล้ว

เนื้อหาโหราศาสตร์มีไว้เพื่อการไตร่ตรองและความบันเทิง ฟีเจอร์ Cosmic Story v2 ที่อธิบายไว้ที่นี่อยู่ระหว่างการพัฒนา ความพร้อมให้บริการอาจมีการเปลี่ยนแปลงโดยไม่ต้องแจ้งให้ทราบล่วงหน้า