နားလည်ထားရမယ့် အချက်
`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 လိုအပ်ပါတယ်။
အတူတူ စမ်းရေးကြည့်မယ်
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;
},
},
};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 — Subscriptions — GraphQL