Thuta Learning
ရှာဖွေရန်
GraphQL
AdvancedWeb Developmentbeginner

Subscriptions — Real-Time Updates

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Subscriptions — Real-Time Updates concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • နမူနာ GraphQL query/code ကို ကိုယ်တိုင် run ပြီး output စစ်နိုင်ရန်
  • Tutorial Platform project နှင့် production scenario တွင် မှန်ကန်စွာအသုံးချနိုင်ရန်

နားလည်ထားရမယ့် အချက်

`subscription` က GraphQL ရဲ့ တတိယ operation type ဖြစ်ပြီး query/mutation က HTTP request-response တစ်ခါတည်းသုံးရင် subscription ကတော့ WebSocket connection တစ်ခုကို ဖွင့်ထားပြီး event ဖြစ်တိုင်း server ကနေ client ဆီ push ချပါတယ်။ Server-side ကတော့ `subscribe` function က `AsyncIterator` တစ်ခုပြန်ပေးရပါတယ်—PubSub library (in-memory သို့ Redis-backed) ကို event channel အဖြစ်သုံးလေ့ရှိပါတယ်။ Mutation တစ်ခုက event ဖြစ်ပေါ်စေတဲ့အခါ `pubsub.publish(...)` ခေါ်ပြီး subscribers များကို notify လုပ်ပါတယ်။

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

Tutorial Platform ရဲ့ live notification feature ကို `tutorialPublished` subscription ဖြင့် ဆောက်မယ်—`publishTutorial` mutation success ပြီးတိုင်း `pubsub.publish('TUTORIAL_PUBLISHED', ...)` ခေါ်ပြီး browse page ဖွင့်ထားတဲ့ subscribers များအားလုံး ချက်ချင်း update ရမယ်။ Multi-server deployment မှာတော့ in-memory PubSub မလုံလောက်ဘဲ Redis-backed PubSub လိုအပ်ပါတယ်။

အတူတူ စမ်းရေးကြည့်မယ်

typescript
const typeDefs = `#graphql
  type Subscription {
    tutorialPublished: Tutorial!
  }
`;

const resolvers = {
  Subscription: {
    tutorialPublished: {
      subscribe: () => pubsub.asyncIterator(['TUTORIAL_PUBLISHED']),
    },
  },
  Mutation: {
    publishTutorial: async (_parent: unknown, args: { id: string }) => {
      const tutorial = await tutorialRepository.publish(args.id);
      pubsub.publish('TUTORIAL_PUBLISHED', { tutorialPublished: tutorial });
      return tutorial;
    },
  },
};
You should see
Subscription field တစ်ခုရေးပြီး mutation ကနေ event publish လုပ်တဲ့ flow ကို ရှင်းပြနိုင်မည်။

၅ မိနစ် စမ်းကြည့်

`commentAdded(tutorialId: ID!): Comment!` subscription တစ်ခု design လုပ်ပြီး `addComment` mutation ကနေ ဘယ်လို publish လုပ်မလဲ ရေးပါ။

သတိလေးတစ်ချက်

Subscription connection အားလုံးကို authorization/filtering မလုပ်ဘဲ ဖွင့်ထားရင် user တစ်ဦးက scope ပြင်ပ data (ဥပမာ private tutorial event) ကို subscribe လုပ်ကြားနိုင်ပါတယ်—subscribe function ထဲမှာလည်း auth check ထားပါ။

Apollo Server — SubscriptionsGraphQL

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • Subscription connection အားလုံးကို authorization/filtering မလုပ်ဘဲ ဖွင့်ထားရင် user တစ်ဦးက scope ပြင်ပ data (ဥပမာ private tutorial event) ကို subscribe လုပ်ကြားနိုင်ပါတယ်—subscribe function ထဲမှာလည်း auth check ထားပါ။
  • နမူနာ query/mutation ကို production API ပေါ် တိုက်ရိုက်မစမ်းဘဲ local/test server နှင့် recoverable data ပေါ်တွင် အရင်အတည်ပြုပါ။

လေ့ကျင့်ခန်း

`commentAdded(tutorialId: ID!): Comment!` subscription တစ်ခု design လုပ်ပြီး `addComment` mutation ကနေ ဘယ်လို publish လုပ်မလဲ ရေးပါ။

You'll know it worked when: Subscription field တစ်ခုရေးပြီး mutation ကနေ event publish လုပ်တဲ့ flow ကို ရှင်းပြနိုင်မည်။

Subscriptions — Real-Time Updates | Thuta Learning