Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ActionBase: 실시간 유저 활동 데이터 서빙 시스템 소개

kakao
November 01, 2024

ActionBase: 실시간 유저 활동 데이터 서빙 시스템 소개

#데이터 처리 #실시간 시스템 #빅데이터 #유저 행동 분석 #데이터베이스

대규모 실시간 유저 활동 데이터 서빙 시스템, ActionBase를 소개합니다.
1. 저지연(<10ms), 높은 처리량(수십만 RPS), 대용량 저장(수백만 TB)을 지원하는 시스템 아키텍처
2. 유저 활동의 효율적 저장 및 조회를 위한 데이터 모델과 쿼리 엔진 설계
3. BASE 모델 기반의 동시성 제어와 데이터 일관성 유지 방안
4. 선물하기 위시, 쇼핑하기 찜, 쇼핑탭 등 다양한 실제 서비스 적용 사례

발표자 : emeth.kim
늘 더 나은 방법을 고민하는 개발자입니다.

kakao

November 01, 2024
Tweet

More Decks by kakao

Other Decks in Programming

Transcript

  1.  "DUJPO#BTFࣗѐ  ઱ਃ੸ਊࢎ۹  ਬ੷ഝزؘ੉ఠ੷੢߂௪ܻ  ӝࣿ੸ౠ૚  ؘ੉ఠ౵੉೐ۄੋ

    झ౟ܻ߁ ߓ஖  दझమҳࢿ߂উ੿ࢿഛࠁߑউ  ݃ޖܻ߂ೱറ҅ദ
  2.  ؀ӏݽपदрਬ੷ഝزؘ੉ఠࢲࡂदझమ ઱ਃౠ૚  ੷૑ো୊ܻ NT  ֫਷୊ܻ۝ ࣻभ݅314 

    ௾੷੢ҕр ࣻߔ݅5#  ࣻಣഛ੢оמ ৔ೱਸ߉਷೐۽ં౟  4(SBQI )(SBQI%# "QBDIF$BMDJUF $MJDL)PVTF %VDL%#١ ӝৈ੗  NFSMJOMFF ੉ӝച CFOKFPOH ੿߽ળ EBWFMBLF ੉૑ഐ FEFOZPPO ਮ۳ 
 FNFUILJN ӣ޹ࢳ FUIBOW ъࢳ SIZOPZ ੿ਮࢿ TPOVTPIO ୍ࣚࣽ "DUJPO#BTFࣗѐ  ࢶޛೞӝਤद -> पदрࢲ࠺झ୊ܻ -> ؀ӏݽ౟ې೗؀਽ -> ߑ؀ೠؘ੉ఠҙܻ -> ࢲ࠺झࢿ੢ীਬোೞѱ؀਽ ࣳೝೞӝଫ
  3.  ਬ੷оࢲ࠺झܳ੉ਊೞחزউࢤࢿೞח׮নೠ೯ز "DUJPO ೯ز੄৘द  ࠭ ࢚ಿઑഥ ಕ੉૑ߑޙ  ௿ܼ

    ҟҊ௿ܼ ݫ׏ࢶఖ  ࢚ഐ੘ਊ જইਃ ଫೞӝ  ҳݒѾઁ١ ౠ૚  ؀ӏݽࢿ  ୡ׼ࣻभ݅Ѥߊࢤоמ  рױೞҊݒ਋࠼ߣೠਬ੷೯ز  पदрࢲࡂ੄য۰਑ਵ۽ױࣽ۽Ӓ੸੤ীӒ஖ח҃਋ઓ੤ ਬ੷ഝز "DUJWJUZ ؘ੉ఠ   ׮নࢿ  ੌ߈ചػ੷੢ࣗࠗ੤۽пࢲ࠺झ݃׮ة੗੸ҳഅ  ؘ੉ఠഝਊ੄ബਯࢿ੷ೞ ѐੋച߂ਬ੷҃೷ೱ࢚੄೨बؘ੉ఠ
  4.  "DUJPO#BTFࣗѐ  ઱ਃ੸ਊࢎ۹  ਬ੷ഝزؘ੉ఠ੷੢߂௪ܻ  ӝࣿ੸ౠ૚  ؘ੉ఠ౵੉೐ۄੋ

    झ౟ܻ߁ ߓ஖  दझమҳࢿ߂উ੿ࢿഛࠁߑউ  ݃ޖܻ߂ೱറ҅ദ
  5.  "DUJPO#BTFࣗѐ  ઱ਃ੸ਊࢎ۹  ਬ੷ഝزؘ੉ఠ੷੢߂௪ܻ -> ਬ੷ഝزݽ؛ ॳӝ ௪ܻ

     ӝࣿ੸ౠ૚  ؘ੉ఠ౵੉೐ۄੋ झ౟ܻ߁ ߓ஖  दझమҳࢿ߂উ੿ࢿഛࠁߑউ  ݃ޖܻ߂ೱറ҅ദ
  6.  ਬ੷ഝزݽ؛  "DUPS ೯ਤ੗ 
 ৘ਬ੷ "DUJPO ೯ز 


    ৘ਤद ଫ ઑഥ ҳݒ 5JNF ೯ز੉ߊࢤೠद੼ ৘য়റद "DUPSо5BSHFUਸ"DUJPO೮׮۽಴അ ৘द୸ध੉оҊҳ݃ܳਤद೮׮ ஘ҳҕѐ۽য়റदী ੢੼ ߧਊࢿ ׮নೠਬ੷ഝزਸੌҙػߑधਵ۽಴അ ഛ੢ࢿ ࠺ૉפझਃҳࢎ೦߸ചীਬোೞѱ؀਽ ௪ܻബਯࢿ ೯ਤ੗ ؀࢚ ೯زਸӝળਵ۽ബਯ੸ੋ௪ܻооמ 5BSHFU ؀࢚ ৘࢚ಿ ௑బ౟ $POUFYU ݓۅ ৘஘ҳҕѐ
  7.  ઙܨ ੷੢ࣗ ੿੄ ৘द Ӓې೐಴അ ݽ؛ ݫఋझషয ਬ੷ഝز੄ҳઑܳ੿੄ೠౣ ਬ੷о࢚ಿਸਤद೮׮

    ؘ੉ఠ )#BTF ਬ੷੄पઁഝزীࢲࢤࢿػч u୸ध੉uоuҊҳ݃uਸuਤदu೮׮  ࠗо੿ࠁ஘ҳҕѐ ਬ੷ഝزݽ؛җपઁؘ੉ఠࢶޛೞӝਤद৘  ਤद־ܰӝ ҕѐߧਤࢶఖ ਤदী׸ӝ৮ܐ Ӓې೐੄৆૑ܳࢤࢿ ୸ध੉ Ҋҳ݃ ҕѐߧਤ஘ҳҕѐ ਤदೠदр5 द੘֢٘ਬ੷ ب଱֢࢚٘ಿ ৆૑੄޷ਤद
  8.  ؘ੉ఠॳӝ൒ܴ   ࢎ੹ӝ۾۽Ӓ 8"- ॳӝ  ୸ध੉ Ҋҳ݃

    हী؀೧ॳӝۅദٙ <- زदࢿࣻ೯ઁয  ਗࠄ ஠਍ఠ ੋؙझؘ੉ఠࢤࢿറੋ௏٬ ׮਺ठۄ੉٘ীࢲ੗ࣁ൤  )#BTFCBUDIো࢑ ੌઙ੄౟ے੥࣌ ਵ۽ॳӝ  ۅ೧ઁ  ߸ؘ҃੉ఠ஭୛ $%$ ॳӝ ॳӝۅ੟ӝ TSD UHUह )#BTFীࢲ 
 അ੤࢚క੍ӝ ਬ੷ഝزؘ੉ఠਗࠄࢤࢿ ஠਍ఠؘ੉ఠࢤࢿ ੋؙझؘ੉ఠࢤࢿ )#BTFীॳӝ 8"-ॳӝ ୸ध੉ Ҋҳ݃ ҕѐߧਤ஘ҳҕѐ ਤदೠदр5 ॳӝۅ೧ઁ $%$ॳӝ      
  9.  u୸धu੉оuҊҳ݃uਸuਤदu೮׮ܳ੷੢ೞӝਤ೧ࢤࢿغחؘ੉ఠ   ֢٘u୸ध੉u৬֢٘uҊҳ݃uਸোѾೞחࢶ ৆૑  ஠਍ఠؘ੉ఠ  ֢٘u୸ध੉uীࢲաоחߑೱ

    -> ੄৆૑ѐࣻ   ֢٘uҊҳ݃uਵ۽ٜযоחߑೱ <- ੄৆૑ѐࣻ   ੋؙझؘ੉ఠ  ֢٘u୸ध੉uীࢲաоחߑೱ -> ੄ੋؙझؘ੉ఠ  ֢٘uҊҳ݃uਵ۽ٜযоחߑೱ <- ੄ੋؙझؘ੉ఠ ਤदৈࠗ ਬ੷੄୭नࣽਤदݾ۾ ࢚ಿਸਤदೠਬ੷ࣻ ࢚ಿਸਤदೠ୭नࣽਬ੷ݾ۾ ਬ੷੄ਤदࣻ (&5 $06/5 4$"/
  10.  "DUJPO#BTF௪ܻ(&5$06/54$"/  (&5 ౠ੿ҙ҅ഛੋ ৘୸ध੉оҊҳ݃ܳਤद type: GET name: get_wish

    # ௪ܻ Ѿҗ ੉ܴ service: gift # ࢲ࠺झ label: wish # ۨ੉࠶ src: { type: VALUE, value: ୸ध੉ } tgt: { type: VALUE, value: Ҋҳ݃ } ୸ध੉ Ҋҳ݃ $06/5 ҙ҅ࣻ҅࢑ ৘୸ध੉оਤदೠ࢚ಿࣻ type: COUNT name: wish_count # ௪ܻ Ѿҗ ੉ܴ service: gift # ࢲ࠺झ label: wish # ۨ੉࠶ src: { type: VALUE, value: ୸ध੉ } dir: OUT ୸ध੉ ৆૑ѐࣻ 4$"/ ҙ҅ݾ۾ઑഥ ৘୸ध੉оਤदೠ࢚ಿݾ۾ type: SCAN name: wish_list # ௪ܻ Ѿҗ ੉ܴ service: gift # ࢲ࠺झ label: wish # ۨ੉࠶ src: { type: VALUE, value: ୸ध੉ } dir: OUT index: wished_at_desc ୸ध੉ ѐ ѐ ѐ Ҋҳ݃ х੗ ׼Ӕ ৆૑ݾ۾ )#BTFীॳੋؘ੉ఠܳ૒੽ઑഥೞח௪ܻ - -
  11.  4$"/ױ҅ ஘ҳ੄ਤदݾ۾ type: SCAN name: friend_wish_list # ௪ܻ Ѿҗ

    ੉ܴ service: gift # ࢲ࠺झ label: wish # ۨ੉࠶ src: type: REF 
 ref: friend_list, # খ ױ҅ ଵઑ field: tgt dir: OUT index: wished_at_desc 4$"/ױ҅ ୸ध੉੄஘ҳݾ۾ type: SCAN name: friend_list # ௪ܻ Ѿҗ ੉ܴ service: gift # ࢲ࠺झ label: friend # ۨ੉࠶ src: { type: VALUE, value: ୸ध } dir: OUT index: created_at_desc "DUJPO#BTF௪ܻ׮ױ҅௰ܻ  GSJFOE@MJTU GSJFOE@XJTI@MJTU যೖ஖ ۄ੉঱ ழೖ ா੉௼ ର пױ҅ী(&5$06/54$"/ܳݽفࢎਊоמ ୸ध੉
  12.  "DUJPO#BTF௪ܻ୊ܻ߂਽׹  ௿ۄ੉঱౟ 4$"/ױ҅ ୸ध੉஘ҳݾ۾ )#BTF GSJFOE@MJTU "DUJPO#BTFজ࢚੄ݫݽܻ GSJFOE@XJTI@MJTU

    NPTU@QPQVMBS - name: friend_list meta: 
 - { name: src, type: STRING, desc: ਬ੷ } - { name: tgt, type: STRING, desc: ஘ҳ } data: - { src: ୸ध੉, tgt: ۄ੉঱ } - { src: ୸ध੉, tgt: যೖ஖ } - name: friend_wish_list … - name: most_popular … 4$"/ױ҅ ஘ҳ੄ਤदݾ۾ 42- ୶о࠺ૉפझ۽૒ +TPO+TPO$PNQBDU૑ਗ type: SQL name: most_popular sql: |- 
 SELECT tgt as product_id, COUNT(1) 
 FROM friend_wish_list GROUP BY tgt ORDER BY COUNT(1) DESC LIMIT 5 "QBDIF$BMDJUF
  13.  "DUJPO#BTFࣗѐ  ઱ਃ੸ਊࢎ۹  ਬ੷ഝزؘ੉ఠ੷੢߂௪ܻ  ӝࣿ੸ౠ૚ -> #"4&ݽ؛

    زदࢿࣻ೯ઁযߑध ੌҙࢿݽ؛ ݵ١ࢿ  ؘ੉ఠ౵੉೐ۄੋ झ౟ܻ߁ ߓ஖  दझమҳࢿ߂উ੿ࢿഛࠁߑউ  ݃ޖܻ߂ೱറ҅ദ
  14.  #"4&৬"$*%  "$*% #"4& ઱ਃౠࢿ  "UPNJDJUZ ਗ੗ࢿ 

    $POTJTUFODZ ੌҙࢿ  *TPMBUJPO Ҋ݀ࢿ  %VSBCJMJUZ ૑ࣘࢿ  #BTJDBMMZBWBJMBCMF ӝࠄоਊࢿ  4PGUTUBUF ࣗ೐౟࢚క  &WFOUVBMMZDPOTJTUFOU ୭ઙੌҙࢿ ࢿמ߂ഛ੢ࢿ  ࣻ૒੸ഛ੢  ֫਷ࢿמ ࣻಣ੸ഛ੢ਊ੉ ؘ੉ఠੌҙࢿ  ૊दੌҙࢿࠁ੢  ୭ઙੌҙࢿࠁ੢ ੸೤ೠࢎਊࢎ۹  Әਲ਼Ѣې ੿ഛࢿ੉઺ਃೠदझమ  ؀ӏݽ࠙࢑दझమ ֫਷оਊࢿ೙ਃ "DUJPO#BTF ✓
  15.  ࠺ҙ੸ 1$$ բҙ੸ 0$$ زदࢿࣻ೯ઁয 
 1FTTJNJTUJD 0QUJNJTUJD$PODVSSFODZ$POUSPM 

    ࠺ҙ੸زदࢿࣻ೯ઁয 1$$ բҙ੸زदࢿࣻ೯ઁয 0$$ ੽Ӕߑध  ؘ੉ఠ੽Ӕद ॳӝद੘ ۅദٙ  ழ޿द੼ী୽جѨࢎ ੢੼  ૊दؘ੉ఠੌҙࢿ  ֫਷زदࢿ ؘ٘ۅহ਺ ױ੼  ࢿמ੷ೞоמࢿ ؘ٘ۅਤ೷  ୽جद܀ߔߊࢤ ز੘ࢸݺ "DUJPO#BTF ✓ 
 ৆૑߂ੋؙझ৬஠਍ఠزद੷੢ҳഅਊ੉ ॳӝۅദٙ TSD UHUह ੍Ҋ ࣻ੿ೞҊ߈৔ 3FBE - .PEJGZ - 8SJUF ॳӝۅ೧ઁ ੤दب ؘ٘ۅਤ೷ ੐҅ҳ৉ ୽جद܀ߔ അ੤࢚క੍ӝ 3FBE ࣻ੿ .PEJGZ ୽جѨࢎ߂ழ޿ 
 $IFDL - "OE - 4FU
  16.  ୭ઙੌҙࢿҗ૊दੌҙࢿ  ୭ઙੌҙࢿ 
 &WFOUVBM$POTJTUFODZ ૊दੌҙࢿ 
 4USPOH$POTJTUFODZ ੌҙࢿഛࠁ

     ੌ੿दрറ ࣻभ޻ܻୡղ  ૊द ࢿמ߂оਊࢿ  ֫਺  ࢚؀੸ਵ۽ծ਺ ઱ਃ੸ਊࢎ۹  ؀ӏݽ࠙࢑दझమ ࣗ࣍޷٣য  ࢶޛೞӝ ࣳೝೞӝ୭Ӕࠄ࢚ಿ  Әਲ਼Ѣې ઺ਃؘ੉ఠҙܻ  ࢶޛೞӝਤद ࣳೝೞӝଫ ҳഅࠂ੟ࢿ  ծ਺  ֫਺ "DUJPO#BTF ✓  1$$ܳా೧ઁҕ ৘ࢶޛೞӝਤद
  17.  ݵ١ࢿ 
 *EFNQPUFODF زੌೠؘ੉ఠܳৈ۞ߣࣻ೯೧ب୭ઙѾҗо߸ೞ૑ঋ਺ -> G G Y G

    Y ੢੼ 
 दझమউ੿ࢿೱ࢚֎౟ਕ௼য়ܨաदझమ੢গ۽زੌਃ୒੉ৈ۞ߣ୊ܻغبޙઁহ਺ 
 рಞೠؘ੉ఠҙؘܻ੉ఠ݃੉Ӓۨ੉࣌ ী۞ࠂҳоਊ੉ೣ 
  18.  ୭ઙੌҙࢿ߂ݵ١ࢿҳഅ  5 5 दझమ୊ܻࣽࢲ ৆૑ߡ੹ UT 5 ҕѐߧਤ஘ҳҕѐ

    ߡ੹5 ਤदೠदр5 ߡ੹5 5 ҕѐߧਤ߸҃ ҕѐߧਤա݅ࠁӝ ҕѐߧਤ߸҃ ҕѐߧਤ஘ҳҕѐ ࢤࢿ ҕѐߧਤ஘ҳҕѐ 
 ਤदೠदр5 ੉߮౟ࣽࢲ नӏߡ੹ਵ۽߸҃ য়ېػߡ੹ޖद ୭ઙ࢚కҕѐߧਤ஘ҳҕѐ ਤदೠदр5 ৆૑ߡ੹ UT 5 ҕѐߧਤ஘ҳҕѐ ߡ੹5 ਤदೠदр5 ߡ੹5 ৆૑ߡ੹ UT 5 ҕѐߧਤ஘ҳҕѐ ߡ੹5 ਤदೠदр5 ߡ੹5
  19.  "DUJPO#BTFࣗѐ  ઱ਃ੸ਊࢎ۹  ਬ੷ഝزؘ੉ఠ੷੢߂௪ܻ  ӝࣿ੸ౠ૚  ؘ੉ఠ౵੉೐ۄੋ

    झ౟ܻ߁ ߓ஖  -> 8"- $%$ झշࢫ߂݃੉Ӓۨ੉࣌  दझమҳࢿ߂উ੿ࢿഛࠁߑউ  ݃ޖܻ߂ೱറ҅ദ
  20.  ࢎ੹ӝ۾۽Ӓ 8"- ߂߸ؘ҃੉ఠ஭୛ $%$  5 5 ҕѐߧਤ߸҃ ҕѐߧਤա݅ࠁӝ

    ࢤࢿ ҕѐߧਤ஘ҳҕѐ 
 ਤदೠदр5 before: ts: T1 src: ୸ध੉ tgt: Ҋҳ݃ property: { visibility: ஘ҳ ҕѐ } after: ts: T2 src: ୸ध੉ tgt: Ҋҳ݃ property: { visibility: ա݅ ࠁӝ } ts: T2 src: ୸ध੉ tgt: Ҋҳ݃ property: { visibility: ա݅ࠁӝ } $%$ 8"- ؘ੉ఠॳӝਃ୒ -> ࢎ੹ӝ۾۽Ӓ 8"-  -> )#BTF੷੢ -> ߸ؘ҃੉ఠ஭୛ $%$ पदрؘ੉ఠزӝച 
 ࠺زӝॳӝ ׮ܲदझమҗؘ੉ఠزӝച 
 ݃੉Ӓۨ੉࣌ )#BTFॳӝ
  21.  झշࢫ߂݃੉Ӓۨ੉࣌  before: ts: T1 src: ୸ध੉ tgt: Ҋҳ݃

    property: { visibility: ஘ҳ ҕѐ } after: ts: T2 src: ୸ध੉ tgt: Ҋҳ݃ property: { visibility: ա݅ ࠁӝ } $%$੄BGUFSܳऺਵݶഅ੤"DUJPO#BTF੄ؘ੉ఠ৬زੌೠ࢚క -> झշࢫ ૐ࠙ҙܻ "QBDIF4QBSL )JWF5SJOP )%'4 ࣳೝೞӝझշࢫ ࢶޛೞӝਤदझշࢫ )#BTF$MVTUFS )#BTF$MVTUFS झշࢫ -> #VMLMPBE ࣻदрղ 0-"1 ࠂ੟ೠ࠙ࢳ௪ܻ ୡӝझշࢫ .Z42- ކҊ%#١
  22.  "DUJPO#BTFࣗѐ  ઱ਃ੸ਊࢎ۹  ਬ੷ഝزؘ੉ఠ੷੢߂௪ܻ  ӝࣿ੸ౠ૚  ؘ੉ఠ౵੉೐ۄੋ

    झ౟ܻ߁ ߓ஖  दझమҳࢿ߂উ੿ࢿഛࠁߑউ  ݃ޖܻ߂ೱറ҅ദ
  23.  ௏٘ҳઑ  ࢲࡂۨ੉য "QQ 4QSJOH8FC'MVY ࠺زӝਃ୒୊ܻ Ҋࢿמ"1*ઁҕ ௏যۨ੉য $PSF

    ,PUMJO ೨ब࠺ૉפझ۽૒ ੷੢ࣗোѾ ؘ੉ఠ੿੄߂ੋ௏٬ $PEF +BWB 10+0۽ؘ੉ఠҳઑ੿੄ )#BTFীॳӝਤೠ૒۳ച৉૒۳ച झ౟ܻ߁ߓ஖ۨ੉য "QBDIF4QBSL ؀ӏݽؘ੉ఠ୊ܻ߂࠙ࢳ 4DBMB ,PUMJO
  24.  दझమইఃఫ୊  (4-#(MPCBM4FSWFS-PBE#BMBODFS ,&.*஠஠য়੄੹ࢎܻࣗझݽפఠ݂दझమ IUUQT UFDILBLBPDPNQPTUT .BUSJY"1. "&.ࢿמޙઁ৬ী۞ࣻ૘߂࠙ࢳী୭੸ചػݽפఠ݂ࢎղࢲ࠺झ 8"-8SJUF

    - "IFBE-PH ࢎ੹ӝ۾۽Ӓ ؘ੉ఠ߸҃ਃ୒ਸӝ۾ $%$$IBOHF%BUB$BQUVSF ߸ؘ҃੉ఠ஭୛ܳӝ۾ ਬ੷ഝزݽ؛ (4-# ,VCFSOFUFT ௿ۄ੉঱౟ ݫఋझషয 
 .Z42-ژח)#BTF )#BTF ,BGLB ਬ੷ഝز 
 ؘ੉ఠ 8"-$%$ 4QBSL4USFBNJOH#BUDI %SVJE पदр5PQ/୊ܻ١ &MBTUJDTFBSDI 8"-$%$ઑഥ )%'4 $%$ӝ߈झշࢫ١ "DUJPO#BTF ,&.* .BUSJY 
 "1. "&. उب਋పझ౟ ࢜۽਍ਬ੷ഝزࢤࢿ١ 1PE 1PE *%$ j 1PE 1PE *%$ j 1PE 1PE *%$ j
  25.  दաܻয়పझ౟   ࢲ࠺झোزदݽٚ࠺ૉפझ۽૒ী؀೧FOE - UP - FOEदաܻয়੘ࢿ 

    ௏٘߸҃दਬ׫ ా೤పझ౟ࡺ݅ইפۄदաܻয়పझ౟بࣻ೯ ࣳೝೞӝଫ ࢶޛೞӝਤद
  26.  "DUJPO#BTFࣗѐ  ઱ਃ੸ਊࢎ۹  ਬ੷ഝزؘ੉ఠ੷੢߂௪ܻ  ӝࣿ੸ౠ૚  ؘ੉ఠ౵੉೐ۄੋ

    झ౟ܻ߁ ߓ஖  दझమҳࢿ߂উ੿ࢿഛࠁߑউ  ݃ޖܻ߂ೱറ҅ദ
  27.  ݃ޖܻ߂ೱറ҅ദ   "DUJPO#BTFח؀ӏݽपदрਬ੷ഝزؘ੉ఠࢲࡂदझమ ࢶޛೞӝਤद ࣳೝೞӝଫ ׮নೠ೐۽ݽ࣌ী੸ਊؽ #"4&ݽ؛ਸҳഅೞ৓Ҋ ѼҊೞѱҙܻ઺

    ઱ਃఃਕ٘  ਬ੷ഝزݽ؛ #"4&ݽ؛ ୭ઙੌҙࢿ &WFOUVBM$POTJTUFODZ ݵ١ࢿ *EFNQPUFODF 
 ࢎ੹ӝ۾۽Ӓ 8"- ߸ؘ҃੉ఠ஭୛ $%$ उب਋పझ౟ খਵ۽ೡੌ  ૑ࣘоמೞѱٜ݅ӝ  --.җ੄োز 3"(
  28. ஠஠য় 
 4& )#BTF ,BGLB %,04 ,VCFSOFUFT %SVJE &4 )BEPPQ

    %#ઑ૒җ 
 ࢶޛೞӝ ࣳೝೞӝ ࣳೝచࢲ࠺झѐߊઑ૒ ழݠझ೒ۖಬ хࢎ٘݀פ׮
  29. 2"