Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ" Салом, сокинони Хабро! Ин китоб барои ҳама таҳиягаре, ки мехоҳад коркарди риштаро фаҳмад, мувофиқ аст. Фаҳмидани барномасозии тақсимшуда ба шумо кӯмак мекунад, ки ҷараёни Кафка ва Кафкаро беҳтар дарк кунед. Хуб мебуд, ки худи чаҳорчӯбаи Кафка бидонед, аммо ин шарт нест: ман ба шумо ҳама чизеро, ки ба шумо лозим аст, мегӯям. Таҳиягарони ботаҷриба ва ҳам навгониҳои Кафка дар ин китоб чӣ гуна сохтани барномаҳои ҷолиби коркарди ҷараёнро бо истифода аз китобхонаи ҷараёнҳои Кафка меомӯзанд. Таҳиягарони миёна ва пешрафтаи Java, ки аллакай бо мафҳумҳо ба монанди сериализатсия ошно ҳастанд, истифода бурдани малакаҳои худро барои эҷоди замимаҳои Кафка Streams меомӯзанд. Рамзи сарчашмаи китоб дар Java 8 навишта шудааст ва аз синтаксиси ифодаи lambda Java 8 ба таври назаррас истифода мебарад, аз ин рӯ донистани тарзи кор бо функсияҳои лямбда (ҳатто бо забони дигари барномасозӣ) муфид хоҳад буд.

Иқтибос. 5.3. Амалҳои ҷамъкунӣ ва тирезасозӣ

Дар ин бахш, мо ба омӯхтани қисматҳои умедбахши ҷараёни Кафка идома медиҳем. То ҳол мо ҷанбаҳои зерини ҷараёни Кафкаро баррасӣ кардем:

  • ташкили топологияи коркард;
  • истифодаи ҳолат дар барномаҳои ҷараён;
  • иҷрои пайвастҳои ҷараёни маълумот;
  • фарқияти байни ҷараёнҳои рӯйдодҳо (KStream) ва ҷараёнҳои навсозӣ (KTable).

Дар мисолҳои зерин мо ҳамаи ин унсурҳоро якҷоя мекунем. Шумо инчунин дар бораи тиреза, як хусусияти олии барномаҳои ҷараёнро меомӯзед. Мисоли аввалини мо як агрегати оддӣ хоҳад буд.

5.3.1. Ҷамъоварии фурӯши саҳмияҳо аз рӯи соҳаҳои саноат

Ҷамъоварӣ ва гурӯҳбандӣ ҳангоми кор бо маълумоти ҷараёнӣ воситаҳои муҳим мебошанд. Баррасии сабтҳои инфиродӣ, ки онҳо гирифта мешаванд, аксар вақт нокифоя аст. Барои гирифтани маълумоти иловагӣ аз маълумот, онҳоро гурӯҳбандӣ кардан ва якҷоя кардан лозим аст.

Дар ин мисол, шумо либоси як савдогари рӯзонаро мепӯшед, ки бояд ҳаҷми фурӯши саҳмияҳои ширкатҳоро дар якчанд соҳа пайгирӣ кунад. Махсусан, шумо ба панҷ ширкате таваҷҷӯҳ доред, ки дар ҳар як соҳа фурӯши саҳмияҳои калон доранд.

Чунин ҷамъбаст барои тарҷумаи маълумот ба шакли дилхоҳ (бо истилоҳи умумӣ) якчанд қадамҳои зеринро талаб мекунад.

  1. Эҷоди як манбаъ дар асоси мавзӯъ, ки иттилооти савдои саҳмияҳоро нашр мекунад. Мо бояд объекти навъи StockTransaction-ро ба объекти навъи ShareVolume харита кунем. Гап дар он аст, ки объекти StockTransaction дорои метамаълумоти фурӯш аст, аммо ба мо танҳо маълумот дар бораи шумораи саҳмияҳои фурӯхташуда лозим аст.
  2. Маълумоти ShareVolume аз рӯи аломати саҳҳомӣ гурӯҳбандӣ. Пас аз он ки аз рӯи аломат гурӯҳбандӣ карда мешавад, шумо метавонед ин маълумотро ба зермаҷмӯҳои ҳаҷми фурӯши саҳмияҳо пӯшонед. Қобили зикр аст, ки усули KStream.groupBy намунаи навъи KGroupedStreamро бармегардонад. Ва шумо метавонед бо даъвати минбаъдаи усули KGroupedStream.reduce як мисоли KTable гиред.

Интерфейси KGroupedStream чист?

Усулҳои KStream.groupBy ва KStream.groupByKey мисоли KGroupedStreamро бармегардонанд. KGroupedStream як намоиши фосилавии ҷараёни рӯйдодҳо пас аз гурӯҳбандӣ аз рӯи калидҳо мебошад. Он умуман барои кори бевосита бо он пешбинӣ нашудааст. Ба ҷои ин, KGroupedStream барои амалиёти ҷамъкунӣ истифода мешавад, ки ҳамеша ба KTable оварда мерасонад. Ва азбаски натиҷаи амалиёти ҷамъоварӣ як KTable аст ва онҳо мағозаи давлатиро истифода мебаранд, мумкин аст, ки на ҳама навсозиҳо дар натиҷа ба қубур фиристода шаванд.

Усули KTable.groupBy шабеҳи KGroupedTable - муаррифии фосилавии ҷараёни навсозиҳоро, ки аз рӯи калид гурӯҳбандӣ шудааст, бармегардонад.

Биёед каме танаффус гирем ва ба расм назар андозем. 5.9, ки нишон медиҳад, ки мо ба чӣ ноил шудаем. Ин топология бояд ба шумо аллакай шинос бошад.

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Биёед ҳоло коди ин топологияро бубинем (онро дар файли src/main/java/bbejeck/chapter_5/AggregationsAndReducingExample.java пайдо кардан мумкин аст) (Рӯйхати 5.2).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Рамзи додашуда бо кӯтоҳ будани худ ва ҳаҷми зиёди амалҳои дар чанд сатр иҷрошаванда фарқ мекунад. Шумо метавонед дар параметри якуми усули builder.stream чизи навро мушоҳида кунед: арзиши навъи enum AutoOffsetReset.EARLIEST (инчунин LATEST вуҷуд дорад), бо истифода аз усули Consumed.withOffsetResetPolicy муқаррар карда мешавад. Ин навъи рӯйхатро барои муайян кардани стратегияи барқароркунии ҷуброн барои ҳар як KStream ё KTable истифода бурдан мумкин аст ва аз конфигуратсия бар варианти барқароркунии ҷуброн афзалият дорад.

GroupByKey ва GroupBy

Интерфейси KStream ду усули гурӯҳбандии сабтҳоро дорад: GroupByKey ва GroupBy. Ҳарду KGroupedTable-ро бармегардонанд, бинобар ин шумо шояд ҳайрон шавед, ки фарқияти байни онҳо чист ва кадомашро кай бояд истифода бурд?

Усули GroupByKey вақте истифода мешавад, ки калидҳо дар KStream аллакай холӣ нестанд. Ва муҳимтар аз ҳама, парчами "аз нав тақсимкуниро талаб мекунад" ҳеҷ гоҳ муқаррар карда нашудааст.

Усули GroupBy тахмин мекунад, ки шумо калидҳои гурӯҳбандиро иваз кардаед, аз ин рӯ парчами тақсимот ба true муқаррар карда мешавад. Иҷрои пайвастанҳо, ҷамъбастҳо ва ғ. пас аз усули GroupBy боиси тақсимоти автоматии дубора мегардад.
Хулоса: То ҳадди имкон шумо бояд GroupByKey на аз GroupBy истифода баред.

Маълум аст, ки усулҳои mapValues ​​ва groupBy чӣ кор мекунанд, аз ин рӯ биёед ба усули sum() назар андозем (дар src/main/java/bbejeck/model/ShareVolume.java пайдо шудааст) (Рӯйхати 5.3).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Усули ShareVolume.sum ҳаҷми умумии фурӯши саҳмияҳоро бармегардонад ва натиҷаи тамоми силсилаи ҳисобҳо объекти KTable мебошад . Акнун шумо фаҳмед, ки нақши KTable мебозад. Вақте ки объектҳои ShareVolume меоянд, объекти мувофиқи KTable навсозии охирини ҷорӣро нигоҳ медорад. Дар хотир доштан муҳим аст, ки ҳама навсозиҳо дар shareVolumeKTable-и қаблӣ инъикос мешаванд, аммо на ҳама минбаъд фиристода мешаванд.

Сипас, мо ин KTable-ро барои ҷамъоварӣ (аз рӯи шумораи саҳмияҳои фурӯхташуда) истифода мебарем, то ба панҷ ширкате, ки ҳаҷми баландтарини саҳмияҳо дар ҳар як соҳа фурӯхта мешаванд, бирасем. Амалҳои мо дар ин маврид ба амалҳои ҷамъоварии аввал монанд хоҳанд буд.

  1. Барои гурӯҳбандии объектҳои инфиродии ShareVolume аз рӯи соҳа амалиёти дигари groupBy иҷро кунед.
  2. Ба ҷамъбасти объектҳои ShareVolume оғоз кунед. Ин дафъа объекти ҷамъкунӣ навбати афзалиятноки андозаи собит аст. Дар ин навбати андозаи собит танҳо панҷ ширкате нигоҳ дошта мешаванд, ки миқдори зиёди саҳмияҳои фурӯхташуда доранд.
  3. Навбатҳоро аз параграфи қаблӣ ба арзиши сатр харита кунед ва панҷ саҳмияи беҳтаринро аз рӯи рақам аз рӯи соҳа баргардонед.
  4. Натиҷаҳоро дар шакли сатр ба мавзӯъ нависед.

Дар расми. Дар расми 5.10 графики топологияи ҷараёни додаҳо нишон дода шудааст. Тавре ки шумо мебинед, даври дуюми коркард хеле содда аст.

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Акнун, ки мо дар бораи сохтори ин даври дуюми коркард фаҳмиши дақиқ дорем, мо метавонем ба рамзи сарчашмаи он муроҷиат кунем (шумо онро дар файли src/main/java/bbejeck/chapter_5/AggregationsAndReducingExample.java пайдо мекунед) (Рӯйхати 5.4) .

Ин оғозкунанда дорои тағирёбандаи fixedQueue мебошад. Ин объекти фармоишӣ аст, ки адаптер барои java.util.TreeSet мебошад, ки барои пайгирии N натиҷаҳои боло бо тартиби камшавии саҳмияҳои савдо истифода мешавад.

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Шумо аллакай зангҳои groupBy ва mapValues ​​-ро дидаед, аз ин рӯ мо ба онҳо дохил намешавем (мо усули KTable.toStreamро даъват мекунем, зеро усули KTable.print бекор карда шудааст). Аммо шумо то ҳол версияи KTable-и aggregate()-ро надидаед, аз ин рӯ мо барои муҳокимаи он вақти каме сарф мекунем.

Тавре ки шумо дар хотир доред, он чизе ки KTable-ро фарқ мекунад, дар он аст, ки сабтҳо бо калидҳои якхела навсозӣ ҳисобида мешаванд. KTable вуруди кӯҳнаро бо нав иваз мекунад. Ҷамъоварӣ ба ҳамин тариқ сурат мегирад: сабтҳои охирин бо як калид ҷамъ карда мешаванд. Вақте ки сабт ворид мешавад, он ба мисоли синфи FixedSizePriorityQueue бо истифода аз ҷамъкунанда (параметри дуюм дар занги усули ҷамъшуда) илова карда мешавад, аммо агар сабти дигар аллакай бо ҳамон калид мавҷуд бошад, пас сабти кӯҳна бо истифода аз ҷудокунанда хориҷ карда мешавад (параметри сеюм дар даъвати усули ҷамъоварда).

Ин ҳама маънои онро дорад, ки агрегатори мо, FixedSizePriorityQueue, на ҳама арзишҳоро бо як калид ҷамъбаст мекунад, балки маблағи ҳаракаткунандаи миқдори N намуди саҳмияҳои аз ҳама савдошавандаро нигоҳ медорад. Ҳар як вурудоти воридотӣ шумораи умумии саҳмияҳои то имрӯз фурӯхташударо дар бар мегирад. KTable ба шумо маълумот медиҳад, ки саҳмияҳои кадом ширкатҳо дар айни замон бештар фурӯхта мешаванд, бидуни талаб кардани ҷамъбасти ҳар як навсозӣ.

Мо ду чизи муҳимро ёд гирифтем:

  • арзишҳои гурӯҳӣ дар KTable бо калиди умумӣ;
  • амалиётҳои муфидро ба монанди ҷамъоварӣ ва ҷамъкунӣ дар ин арзишҳои гурӯҳбандӣ иҷро кунед.

Донистани чӣ гуна иҷро кардани ин амалҳо барои фаҳмидани маънои маълумоте, ки тавассути замимаи Кафка Streams ҳаракат мекунад ва фаҳмидани он, ки кадом маълумотро дар бар мегирад, муҳим аст.

Мо инчунин баъзе мафҳумҳои асосиро, ки қаблан дар ин китоб баррасӣ шуда буданд, ҷамъ овардем. Дар боби 4, мо муҳокима кардем, ки то чӣ андоза давлати маҳаллӣ барои барномаи ҷараёнӣ муҳим аст. Мисоли аввал дар ин боб нишон дод, ки чаро давлати маҳаллӣ ин қадар муҳим аст - он ба шумо имкон медиҳад, ки маълумотеро, ки аллакай дидаед, пайгирӣ кунед. Дастрасии маҳаллӣ аз таъхирҳои шабака канорагирӣ мекунад ва ин барномаро бештар иҷрокунанда ва ба хатогиҳо тобовар мегардонад.

Ҳангоми иҷрои ҳама гуна амалиёти ҷамъоварӣ ё ҷамъкунӣ, шумо бояд номи мағозаи давлатиро муайян кунед. Амалиётҳои ҷамъоварӣ ва ҷамъоварӣ як мисоли KTable-ро бармегардонанд ва KTable нигаҳдории ҳолатиро барои иваз кардани натиҷаҳои кӯҳна бо натиҷаҳои нав истифода мебарад. Тавре ки шумо дидед, на ҳама навсозиҳо ба қубур фиристода мешаванд ва ин муҳим аст, зеро амалиёти ҷамъкунӣ барои тавлиди иттилооти ҷамъбастӣ пешбинӣ шудааст. Агар шумо иёлати маҳаллиро истифода набаред, KTable ҳамаи натиҷаҳои ҷамъбаст ва ҷамъбастро интиқол медиҳад.

Минбаъд, мо ба иҷрои амалҳо, ба монанди ҷамъкунӣ дар муддати муайяни вақт - ба истилоҳ амалиёти тирезасозӣ назар мекунем.

5.3.2. Амалиётҳои тиреза

Дар фасли қаблӣ, мо конволютсияи слайд ва агрегатсияро ҷорӣ кардем. Ин барнома афзоиши пайвастаи ҳаҷми фурӯши саҳмияҳоро анҷом дод ва пас аз он ҷамъбасти панҷ саҳмияҳои аз ҳама бештар дар биржа фурӯхташавандаро анҷом дод.

Баъзан чунин ҷамъбаст ва ҷамъбасти натиҷаҳо зарур аст. Ва баъзан ба шумо лозим меояд, ки амалиётро танҳо дар муддати муайян иҷро кунед. Масалан, ҳисоб кунед, ки дар 10 дақиқаи охир бо саҳмияҳои як ширкати мушаххас чанд амалиёти мубодила анҷом дода шудааст. Ё чӣ қадар корбарон дар 15 дақиқаи охир баннерҳои нави таблиғотиро клик карданд. Барнома метавонад чунин амалҳоро якчанд маротиба иҷро кунад, аммо бо натиҷаҳое, ки танҳо ба давраҳои муайяни вақт дахл доранд (равзанаҳои вақт).

Ҳисоб кардани амалиёти мубодилавӣ аз ҷониби харидор

Дар мисоли навбатӣ, мо муомилоти саҳҳомӣ дар байни тоҷирони сершумор - хоҳ созмонҳои калон ё маблағгузорони оқилонаи инфиродӣ пайгирӣ хоҳем кард.

Ду сабаби эҳтимолии ин пайгирӣ вуҷуд дорад. Яке аз онҳо зарурати донистани он аст, ки роҳбарони бозор чӣ мехаранд/фурӯшанд. Агар ин бозигарони калон ва сармоягузорони ботаҷриба имкониятро бубинанд, риояи стратегияи онҳо маъно дорад. Сабаби дуюм ин хоҳиши ошкор кардани ҳама гуна аломатҳои эҳтимолии тиҷорати ғайриқонунии инсайдерҳо мебошад. Барои ин ба шумо лозим меояд, ки таносуби афзоишҳои бузурги фурӯшро бо релизҳои муҳими матбуотӣ таҳлил кунед.

Чунин пайгирӣ аз қадамҳои зерин иборат аст:

  • эҷоди ҷараён барои хондан аз мавзӯи муомилоти саҳҳомӣ;
  • гурӯҳбандии сабтҳои воридотӣ аз рӯи ID харидор ва рамзи саҳҳомӣ. Занг задан ба усули groupBy мисоли синфи KGroupedStreamро бармегардонад;
  • Усули KGroupedStream.windowedBy ҷараёни маълумотро, ки ба равзанаи вақт маҳдуд аст, бармегардонад, ки ба ҷамъкунии тиреза имкон медиҳад. Вобаста аз намуди равзана, ё TimeWindowedKStream ё SessionWindowedKStream баргардонида мешавад;
  • ҳисоб кардани транзаксия барои амалиёти ҷамъоварӣ. Ҷараёни додаҳои тиреза муайян мекунад, ки оё дар ин ҳисоб сабти мушаххас ба назар гирифта мешавад;
  • навиштани натиҷаҳо ба мавзӯъ ё баровардани онҳо ба консол ҳангоми таҳия.

Топологияи ин барнома оддӣ аст, аммо тасвири равшани он муфид хоҳад буд. Биёед ба расм назар андозем. 5.11.

Минбаъд, мо функсияҳои амалиёти тиреза ва рамзи мувофиқро дида мебароем.

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"

Намудҳои тиреза

Дар ҷараёни Кафка се намуди тирезаҳо мавҷуданд:

  • сессиявӣ;
  • "тахта";
  • лағжиш/ҷаҳидан.

Кадомашро интихоб кардан аз талаботи тиҷорати шумо вобаста аст. Тирезаҳои паридан ва ҷаҳидан вақт маҳдуданд, дар ҳоле ки равзанаҳои сессия бо фаъолияти корбар маҳдуданд - давомнокии сессия(ҳо) танҳо аз рӯи фаъол будани корбар муайян карда мешавад. Чизи асосие, ки бояд дар хотир дошт, ин аст, ки ҳама намудҳои равзана ба мӯҳрҳои сана/вақти сабтҳо асос ёфтаанд, на ба вақти система.

Баъдан, мо топологияи худро бо ҳар як намуди тиреза амалӣ менамоем. Рамзи мукаммал танҳо дар мисоли аввал дода мешавад; барои дигар намуди тирезаҳо ба ҷуз намуди амалиёти равзана ҳеҷ чиз тағир намеёбад.

Тирезаҳои сессия

Тирезаҳои сессия аз ҳама намудҳои дигари тирезаҳо хеле фарқ мекунанд. Онҳо на аз рӯи вақт, балки аз рӯи фаъолияти корбар (ё фаъолияти субъекте, ки шумо мехоҳед пайгирӣ кунед) маҳдуданд. Тирезаҳои сессия бо давраҳои ғайрифаъолӣ ҷудо карда мешаванд.

Дар расми 5.12 мафҳуми равзанаҳои сессия тасвир шудааст. Иҷлосияи хурдтар бо сессия дар тарафи чапи он якҷоя мешавад. Ва сессия дар тарафи рост алоҳида хоҳад буд, зеро он як давраи тӯлонии бефаъолиятро пайгирӣ мекунад. Тирезаҳои сессия ба фаъолияти корбар асос ёфтаанд, аммо мӯҳрҳои сана/вақтро аз сабтҳо барои муайян кардани ба кадом сессия тааллуқ доштани сабт истифода баред.

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"

Истифодаи тирезаҳои сессия барои пайгирии муомилоти саҳҳомӣ

Биёед барои гирифтани маълумот дар бораи муомилоти мубодила аз тирезаҳои сессия истифода барем. Амалисозии равзанаҳои сессия дар Рӯйхати 5.5 нишон дода шудааст (ки онро дар src/main/java/bbejeck/chapter_5/CountingWindowingAndKTableJoinExample.java пайдо кардан мумкин аст).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Шумо аллакай аксари амалиётҳоро дар ин топология дидаед, аз ин рӯ лозим нест, ки дар ин ҷо дубора ба онҳо нигоҳ кунед. Аммо дар ин ҷо якчанд унсурҳои нав мавҷуданд, ки мо ҳоло онҳоро баррасӣ хоҳем кард.

Ҳама гуна амалиёти groupBy маъмулан як намуди амалиёти ҷамъкуниро иҷро мекунад (ҷамъкунӣ, ҷамъоварӣ ё ҳисобкунӣ). Шумо метавонед ҷамъкунии ҷамъшавандаро бо ҷамъи иҷрошаванда ё ҷамъкунии тиреза, ки сабтҳоро дар равзанаи вақти муайян ба инобат мегирад, иҷро кунед.

Рамзи дар Листинги 5.5 шумораи транзаксияҳоро дар равзанаҳои сессия ҳисоб мекунад. Дар расми. 5.13 Ин амалҳо зина ба зина таҳлил карда мешаванд.

Бо занг задан windowedBy(SessionWindows.with(twentySeconds).until(fifteenMinutes)) мо равзанаи сессияро бо фосилаи ғайрифаъолиятӣ 20 сония ва фосилаи устувории 15 дақиқа эҷод мекунем. Фосилаи бекории 20 сония маънои онро дорад, ки барнома ҳама гуна сабтеро, ки дар давоми 20 сония пас аз анҷом ё оғози сессияи ҷорӣ ба сессияи ҷорӣ (фаъол) ворид мешавад, дар бар мегирад.

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Баъдан, мо муайян мекунем, ки кадом амалиёти ҷамъкунӣ дар равзанаи сеанс бояд иҷро карда шавад - дар ин ҳолат ҳисоб кунед. Агар вуруди воридотӣ берун аз равзанаи ғайрифаъолиятӣ (ҳар ду тарафи мӯҳри сана/вақт) афтад, барнома сессияи нав эҷод мекунад. Фосилаи нигоҳдорӣ маънои нигоҳ доштани сеансро барои як муддати муайян дорад ва имкон медиҳад, ки маълумоти дер, ки берун аз давраи ғайрифаъолияти сессия тӯл мекашад, аммо ба ҳар ҳол замима кардан мумкин аст. Илова бар ин, оғоз ва анҷоми иҷлосияи нав, ки дар натиҷаи муттаҳидшавӣ ба вуҷуд меояд, ба тамғаи аввалин ва охирини сана/вақт мувофиқат мекунад.

Биёед якчанд сабтҳоро аз усули ҳисоб дида бароем, то бубинем, ки сеансҳо чӣ гуна кор мекунанд (Ҷадвали 5.1).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Вақте ки сабтҳо меоянд, мо сессияҳои мавҷударо бо ҳамон калид ҷустуҷӯ мекунем, вақти анҷоми он камтар аз мӯҳри сана/вақти ҷорӣ - фосилаи ғайрифаъолият ва вақти оғоз аз мӯҳри сана/вақти ҷорӣ + фосилаи ғайрифаъолият. Бо назардошти ин, чор сабт аз ҷадвал. 5.1 ба таври зерин ба як сессия муттаҳид карда мешаванд.

1. Сабти 1 аввал меояд, бинобар ин вақти оғоз ба вақти анҷом баробар аст ва 00:00:00 аст.

2. Баъдан, вуруди 2 меояд ва мо сессияҳоро меҷӯем, ки на дертар аз 23:59:55 ба охир мерасанд ва на дертар аз 00:00:35 оғоз мешаванд. Мо сабти 1-ро пайдо мекунем ва ҷаласаҳои 1 ва 2-ро муттаҳид мекунем. Мо вақти оғози сессияи 1 (пештар) ва вақти анҷоми сессияи 2-ро (баъдтар) мегирем, то сессияи нави мо соати 00:00:00 оғоз ва дар соати 00 ба охир мерасад: 00:15.

3. Сабти 3 мерасад, мо сеансҳоро байни 00:00:30 ва 00:01:10 меҷӯем ва ҳеҷ чизро намеёбем. Сеанси дуюмро барои калиди 123-345-654,FFBE, оғоз ва ба охир расидани соати 00:00:50 илова кунед.

4. Сабти 4 мерасад ва мо сеансҳоро байни 23:59:45 ва 00:00:25 ҷустуҷӯ мекунем. Ин дафъа ҳарду ҷаласаҳои 1 ва 2 пайдо мешаванд. Ҳар се ҷаласа дар як ҷамъ оварда шудаанд, ки вақти оғоз 00:00:00 ва вақти анҷоми 00:00:15 мебошад.

Аз он чизе, ки дар ин бахш тавсиф шудааст, бояд нозукиҳои муҳими зеринро ба ёд орем:

  • сессияҳо тирезаҳои андозаи собит нестанд. Давомнокии сессияро фаъолият дар давраи муайян муайян мекунад;
  • Тамғаҳои сана/вақт дар маълумот муайян мекунанд, ки ҳодиса ба сеанси мавҷуда ё дар давраи бекорӣ рост меояд.

Минбаъд мо намуди навбатии равзана - тирезаҳои "тағйирёбанда" -ро муҳокима хоҳем кард.

Тирезаҳои "тағйирёбанда"

Тирезаҳои афтанда рӯйдодҳоеро сабт мекунанд, ки дар як муддати муайян меафтанд. Тасаввур кунед, ки ба шумо лозим аст, ки ҳама муомилоти саҳҳомии як ширкати муайянро ҳар 20 сония сабт кунед, то шумо тамоми рӯйдодҳоро дар ин давра ҷамъоварӣ кунед. Дар охири фосилаи 20 сония равзана чарх мезанад ва ба фосилаи нави мушоҳидаи 20 сония мегузарад. Дар расми 5.14 ин вазъият нишон дода шудааст.

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Тавре ки шумо мебинед, ҳама рӯйдодҳои дар 20 сонияи охир гирифташуда ба тиреза дохил карда мешаванд. Дар охири ин давра, равзанаи нав сохта мешавад.

Рӯйхати 5.6 кодеро нишон медиҳад, ки истифодаи тирезаҳои ғафсро барои сабти муомилоти саҳҳомӣ дар ҳар 20 сония нишон медиҳад (дар src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java пайдо шудааст).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Бо ин тағироти хурд ба занги усули TimeWindows.of, шумо метавонед равзанаи ғафсро истифода баред. Ин мисол усули то ()-ро даъват намекунад, аз ин рӯ фосилаи нигоҳдории пешфарз 24 соат истифода мешавад.

Ниҳоят, вақти он расидааст, ки ба охирин вариантҳои тиреза гузаред - тирезаҳои "ҷаста".

Тирезаҳои ҳаракаткунанда («ҷаҳидан»).

Тирезаҳои лағжиш/ҷаддазан ба тирезаҳои афтанда монанданд, аммо каме фарқият доранд. Тирезаҳои лағжиш пеш аз сохтани равзанаи нав барои коркарди рӯйдодҳои охирин то охири фосилаи вақт интизор намешаванд. Онҳо пас аз фосилаи интизорӣ камтар аз давомнокии тиреза ҳисобҳои навро оғоз мекунанд.

Барои нишон додани фарқияти байни тирезаҳо ва ҷаҳидан, биёед ба мисоли ҳисоб кардани муомилоти биржаи фондӣ баргардем. Ҳадафи мо ҳоло ҳам ҳисоб кардани шумораи транзаксияҳост, аммо мо намехоҳем, ки пеш аз навсозии ҳисобкунак тамоми вақтро интизор шавем. Ба ҷои ин, мо ҳисобкунакро бо фосилаҳои кӯтоҳтар навсозӣ мекунем. Масалан, мо то ҳол шумораи транзаксияҳоро ҳар 20 сония ҳисоб хоҳем кард, аммо ҳисобкунакро ҳар 5 сония навсозӣ мекунем, тавре ки дар расми 5.15 нишон дода шудааст. XNUMX. Дар ин ҳолат, мо бо се равзанаи натиҷа бо маълумоти такроршаванда ба охир мерасем.

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Рӯйхати 5.7 кодро барои муайян кардани тирезаҳои лағжиш нишон медиҳад (дар src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java пайдо шудааст).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Равзанаи фурӯпоширо тавассути илова кардани занг ба усули advanceBy() ба равзанаи чархзананда табдил додан мумкин аст. Дар мисоли нишон додашуда фосилаи сарфа 15 дақиқа аст.

Шумо дар ин бахш дидед, ки чӣ гуна натиҷаҳоро ҷамъбаст кардан ба равзанаҳои вақт маҳдуд карда мешавад. Аз ҷумла, ман мехоҳам, ки шумо се чизи зеринро аз ин бахш дар хотир доред:

  • андозаи равзанаҳои сессия на аз рӯи давраи вақт, балки аз рӯи фаъолияти корбар маҳдуд карда мешавад;
  • Тирезаҳои "тағйирёбанда" шарҳи рӯйдодҳоро дар як давраи муайян пешниҳод мекунанд;
  • Давомнокии ҷаҳиши тирезаҳо муқаррар карда шудааст, аммо онҳо зуд-зуд нав карда мешаванд ва метавонанд дар ҳама тирезаҳо сабтҳои такроршаванда дошта бошанд.

Минбаъд, мо мефаҳмем, ки чӣ тавр KTable-ро ба KStream барои пайваст табдил додан мумкин аст.

5.3.3. Пайваст кардани объектҳои KStream ва KTable

Дар боби 4, мо пайваст кардани ду объекти KStream-ро муҳокима кардем. Ҳоло мо бояд чӣ гуна пайваст кардани KTable ва KStream-ро омӯзем. Ин метавонад бо сабабҳои оддии зерин лозим бошад. KStream ҷараёни сабтҳост ва KTable ҷараёни навсозиҳои сабт аст, аммо баъзан шумо метавонед бо истифода аз навсозиҳои KTable ба ҷараёни сабт контексти иловагӣ илова кунед.

Биёед маълумотро дар бораи микдори муомилоти биржавй гирем ва онхоро бо навигарихои биржахои фонди барои сохахои дахлдор якчоя кунем. Ин аст он чизе ки шумо бояд барои ноил шудан ба ин коде, ки аллакай доред, анҷом диҳед.

  1. Объекти KTable-ро бо маълумот дар бораи шумораи муомилоти саҳҳомӣ ба KStream табдил диҳед ва пас аз он калидро бо калид иваз кунед, ки бахши соҳаеро, ки ба ин рамзи саҳҳомӣ мувофиқ аст, нишон медиҳад.
  2. Объекти KTable эҷод кунед, ки маълумотро аз мавзӯъ бо ахбори биржаи фондӣ мехонад. Ин KTable-и нав аз рӯи бахши саноат гурӯҳбандӣ карда мешавад.
  3. Навсозиҳои ахборро бо маълумот дар бораи шумораи муомилоти биржаи фондӣ аз рӯи бахши саноат пайваст кунед.

Акнун биёед бубинем, ки ин нақшаи чорабинӣ чӣ гуна амалӣ карда мешавад.

Табдил додани KTable ба KStream

Барои табдил додани KTable ба KStream, шумо бояд амалҳои зеринро иҷро кунед.

  1. Ба усули KTable.toStream() занг занед.
  2. Бо занг задан ба усули KStream.map, калидро бо номи саноат иваз кунед ва сипас объекти TransactionSummary-ро аз мисоли Windowed гиред.

Мо ин амалиётҳоро ба таври зерин ба ҳам занҷир мезанем (рамзро дар файли src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java пайдо кардан мумкин аст) (Рӯйхати 5.8).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Азбаски мо амалиёти KStream.map-ро иҷро карда истодаем, мисоли баргардонидашудаи KStream ҳангоми истифода аз пайвастшавӣ ба таври худкор аз нав тақсим карда мешавад.

Мо раванди табдилро анҷом додем, дар оянда мо бояд объекти KTableро барои хондани ахборҳои саҳҳомӣ созем.

Эҷоди KTable барои ахбори саҳҳомӣ

Хушбахтона, сохтани объекти KTable танҳо як сатри кодро мегирад (рамзро дар src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java пайдо кардан мумкин аст) (Рӯйхати 5.9).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Бояд қайд кард, ки ягон объекти Serde талаб карда намешавад, зеро сатри Serdes дар танзимот истифода мешавад. Инчунин, бо истифода аз барӯйхатгирии АВВАЛ, ҷадвал дар аввал бо сабтҳо пур карда мешавад.

Акнун мо метавонем ба марҳилаи ниҳоӣ - пайвастшавӣ гузарем.

Пайваст кардани навсозиҳои ахбор бо маълумоти шумори транзаксия

Эҷоди пайвастшавӣ душвор нест. Мо ҳамроҳшавии чапро дар сурати мавҷуд набудани ахбор барои соҳаи дахлдор истифода хоҳем кард (рамзи заруриро дар файли src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java пайдо кардан мумкин аст) (Рӯйхати 5.10).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Ин оператори leftJoin хеле содда аст. Баръакси пайвастшавӣ дар боби 4, усули JoinWindow истифода намешавад, зеро ҳангоми иҷрои пайвастани KStream-KTable дар KTable барои ҳар як калид танҳо як сабт мавҷуд аст. Чунин пайвастшавӣ бо вақт маҳдуд намешавад: сабт ё дар KTable аст ё ғоиб аст. Хулосаи асосӣ: бо истифода аз объектҳои KTable, шумо метавонед KStream-ро бо маълумоти истинодҳои камтар навшаванда ғанӣ гардонед.

Ҳоло мо роҳи муассиртари ғанисозии рӯйдодҳоро аз KStream дида мебароем.

5.3.4. Объектҳои GlobalKTable

Тавре ки шумо мебинед, зарурати ғанӣ гардонидани ҷараёнҳои рӯйдодҳо ё илова кардани контекст ба онҳо вуҷуд дорад. Дар боби 4 шумо алоқаи байни ду объекти KStream-ро дидед ва дар фасли қаблӣ пайвасти KStream ва KTable-ро дидед. Дар ҳамаи ин ҳолатҳо, ҳангоми харитасозии калидҳо ба намуди нав ё арзиши нав ҷараёни маълумотро дубора тақсим кардан лозим аст. Баъзан тақсимкунӣ ба таври возеҳ анҷом дода мешавад ва баъзан Кафка Streams ин корро ба таври худкор анҷом медиҳад. Аз нав тақсим кардан лозим аст, зеро калидҳо тағир ёфтаанд ва сабтҳо бояд дар бахшҳои нав ҷамъ шаванд, вагарна пайвастшавӣ ғайриимкон хоҳад буд (ин дар боби 4, дар боби “Аз нав тақсим кардани маълумот” дар зербанди 4.2.4 баррасӣ шудааст).

Аз нав тақсим кардан хароҷот дорад

Аз нав тақсимкунӣ хароҷотро талаб мекунад - хароҷоти иловагии захиравӣ барои эҷоди мавзӯъҳои мобайнӣ, нигоҳ доштани маълумоти такрорӣ дар мавзӯи дигар; ин инчунин маънои зиёд шудани таъхирро аз ҳисоби навиштан ва хондан аз ин мавзӯъ дорад. Илова бар ин, агар ба шумо лозим ояд, ки дар зиёда аз як ҷанба ё андоза пайваст шавед, шумо бояд пайвастҳоро занҷир занед, сабтҳоро бо калидҳои нав харита кунед ва раванди дубора тақсимкуниро иҷро кунед.

Пайвастшавӣ ба маҷмӯаҳои хурдтар

Дар баъзе мавридҳо, ҳаҷми маълумоти истинод, ки бояд пайваст шавад, нисбатан хурд аст, аз ин рӯ, нусхаҳои пурраи он метавонанд ба осонӣ дар ҳар як гиреҳ ҷойгир шаванд. Барои чунин ҳолатҳо, Кафка Streams синфи GlobalKTable -ро пешниҳод мекунад.

Намунаҳои GlobalKTable беназиранд, зеро барнома ҳама маълумотро ба ҳар як гиреҳ такрор мекунад. Ва азбаски ҳама маълумот дар ҳар як гиреҳ мавҷуд аст, зарурати тақсим кардани ҷараёни рӯйдодҳо бо калиди маълумотҳои истинод вуҷуд надорад, то он барои ҳама қисмҳо дастрас бошад. Шумо инчунин метавонед бо истифода аз объектҳои GlobalKTable пайвастҳои бе калид созед. Барои нишон додани ин хусусият, биёед ба яке аз мисолҳои қаблӣ баргардем.

Пайваст кардани объектҳои KStream ба объектҳои GlobalKTable

Дар зерфасли 5.3.2 мо ҷамъкунии равзанаи амалиёти мубодиларо аз ҷониби харидорон анҷом додем. Натиҷаҳои ин ҷамъбаст чунин менамуданд:

{customerId='074-09-3705', stockTicker='GUTM'}, 17
{customerId='037-34-5184', stockTicker='CORK'}, 16

Дар ҳоле ки ин натиҷаҳо ба ҳадаф хизмат мекарданд, агар номи муштарӣ ва номи пурраи ширкат низ нишон дода мешуд, муфидтар мебуд. Барои илова кардани номи муштарӣ ва номи ширкат, шумо метавонед пайвастҳои муқаррариро анҷом диҳед, аммо ба шумо лозим меояд, ки ду харитасозии калидӣ ва дубора тақсимкуниро анҷом диҳед. Бо GlobalKTable шумо метавонед аз арзиши чунин амалиётҳо канорагирӣ кунед.

Барои ин, мо объекти countStream-ро аз Рӯйхати 5.11 истифода мебарем (рамзи мувофиқро дар src/main/java/bbejeck/chapter_5/GlobalKTableExample.java пайдо кардан мумкин аст) ва онро ба ду объекти GlobalKTable пайваст мекунем.

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Мо инро қаблан муҳокима карда будем, бинобар ин ман онро такрор намекунам. Аммо ман қайд мекунам, ки код дар функсияи toStream().map барои хондан ба ҷои ифодаи лямбда дарунсохт ба объекти функсия абстракт карда шудааст.

Қадами навбатӣ ин эълон кардани ду мисоли GlobalKTable мебошад (рамзи нишон додашударо дар файли src/main/java/bbejeck/chapter_5/GlobalKTableExample.java пайдо кардан мумкин аст) (Рӯйхати 5.12).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"

Лутфан қайд кунед, ки номҳои мавзӯъҳо бо истифода аз намудҳои номбаршуда тавсиф карда мешаванд.

Ҳоло, ки мо ҳама ҷузъҳоро омода кардем, танҳо навиштани рамзи пайвастшавӣ боқӣ мемонад (ки онро дар файли src/main/java/bbejeck/chapter_5/GlobalKTableExample.java пайдо кардан мумкин аст) (Рӯйхати 5.13).

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Гарчанде ки дар ин код ду пайваст вуҷуд дорад, онҳо занҷирбанданд, зеро ҳеҷ яке аз натиҷаҳои онҳо алоҳида истифода намешаванд. Натиҷаҳо дар охири тамоми амалиёт нишон дода мешаванд.

Вақте ки шумо амалиёти дар боло зикршударо иҷро мекунед, шумо чунин натиҷаҳоро хоҳед гирифт:

{customer='Barney, Smith' company="Exxon", transactions= 17}

Моҳият тағйир наёфтааст, аммо ин натиҷаҳо равшантар ба назар мерасанд.

Агар шумо то боби 4 ҳисоб кунед, шумо аллакай якчанд намуди пайвастҳоро дар амал дидаед. Онҳо дар ҷадвал оварда шудаанд. 5.2. Ин ҷадвал қобилиятҳои пайвастшавиро аз рӯи версияи 1.0.0 Ҷараёни Кафка инъикос мекунад; Дар релизҳои оянда чизе метавонад тағир ёбад.

Китоби «Ҷараёнҳои Кафка дар амал. Барномаҳо ва хидматҳои хурд барои кори вақти воқеӣ"
Барои ҷамъбаст кардани кор, биёед асосҳои асосиро такрор кунем: шумо метавонед ҷараёнҳои рӯйдодҳоро (KStream) пайваст кунед ва ҷараёнҳоро навсозӣ кунед (KTable) бо истифода аз ҳолати маҳаллӣ. Интихобан, агар андозаи маълумоти истинод хеле калон набошад, шумо метавонед объекти GlobalKTable -ро истифода баред. GlobalKTables ҳамаи қисмҳоро ба ҳар як гиреҳи замимаи Кафка Streams такрор мекунад ва кафолат медиҳад, ки ҳама маълумот новобаста аз он ки калид ба кадом қисм мувофиқат мекунад, дастрас аст.

Минбаъд мо хусусияти Ҷараёни Кафкаро мебинем, ки ба шарофати он мо метавонем тағироти ҳолатиро бидуни истеъмоли маълумот аз мавзӯи Кафка мушоҳида кунем.

5.3.5. Ҳолати пурсиш

Мо аллакай якчанд амалиётро бо ҳолати давлатӣ анҷом додаем ва ҳамеша натиҷаҳоро ба консол мебарорем (барои мақсадҳои рушд) ё онҳоро ба мавзӯъ менависем (барои мақсадҳои истеҳсолӣ). Ҳангоми навиштани натиҷаҳо ба мавзӯъ, шумо бояд истеъмолкунандаи Кафкаро барои дидани онҳо истифода баред.

Хониши маълумот аз ин мавзўъњоро метавон як навъи дидгоњњои моддишуда њисоб кард. Барои мақсадҳои мо, мо метавонем таърифи намуди моддӣ аз Википедияро истифода барем: “...объекти пойгоҳи физикии дорои натиҷаҳои дархост. Масалан, он метавонад нусхаи маҳаллии маълумоти дурдаст ё зермаҷмӯи сатрҳо ва/ё сутунҳои ҷадвал ё натиҷаҳо ё ҷадвали ҷамъбастӣ, ки тавассути ҷамъоварӣ ба даст оварда шудааст” (https://en.wikipedia.org/wiki) /Намоиши_моддӣ).

Кафка Streams инчунин ба шумо имкон медиҳад, ки дархостҳои интерактивиро дар мағозаҳои давлатӣ иҷро кунед, ки ба шумо имкон медиҳад, ки ин манзараҳои амалӣшударо мустақиман хонед. Кайд кардан зарур аст, ки дархост ба магазини давлатй амалиёти хониш мебошад. Ин кафолат медиҳад, ки шумо ҳангоми коркарди маълумот дар бораи тасодуфан номувофиқ будани ҳолати шумо хавотир нашавед.

Имконияти бевосита дархост кардани мағозаҳои давлатӣ муҳим аст. Ин маънои онро дорад, ки шумо метавонед барномаҳои панели идоракуниро бидуни гирифтани маълумот аз истеъмолкунандаи Кафка эҷод кунед. Он инчунин самаранокии барномаро зиёд мекунад, зеро зарурати дубора навиштани маълумот вуҷуд надорад:

  • ба шарофати маҳалли ҷойгиршавии маълумот, онҳо метавонанд зуд дастрас шаванд;
  • такрори маълумот бартараф карда мешавад, зеро он ба нигаҳдории беруна навишта нашудааст.

Чизи асосие, ки ман мехоҳам, ки шумо дар хотир дошта бошед, ин аст, ки шумо метавонед мустақиман аз дохили замимаи худ вазъро пурсед. Имкониятҳое, ки ин ба шумо медиҳад, аз ҳад зиёд арзёбӣ кардан мумкин нест. Ба ҷои истеъмоли маълумот аз Кафка ва нигоҳ доштани сабтҳо дар пойгоҳи додаҳо барои барнома, шумо метавонед мағозаҳои давлатиро бо ҳамон натиҷа дархост кунед. Дархостҳои мустақим ба мағозаҳои давлатӣ маънои камтари код (на истеъмолкунанда) ва нармафзори камро доранд (барои нигоҳ доштани натиҷаҳо ба ҷадвали пойгоҳи додаҳо лозим нест).

Мо дар ин боб каме заминаро фаро гирифтем, аз ин рӯ мо муҳокимаи дархостҳои интерактивии худро дар муқобили мағозаҳои давлатӣ ҳоло тарк мекунем. Аммо хавотир нашав: дар боби 9 мо як барномаи оддии панели идоракуниро бо дархостҳои интерактивӣ эҷод мекунем. Он баъзе аз мисолҳои ин ва бобҳои қаблиро барои нишон додани дархостҳои интерактивӣ ва чӣ гуна шумо метавонед онҳоро ба замимаҳои Кафка Streams илова кунед, истифода мебарад.

Натиҷа

  • Объектҳои KStream ҷараёнҳои рӯйдодҳоро муаррифӣ мекунанд, ки бо воридкунӣ ба пойгоҳи додаҳо муқоиса карда мешаванд. Объектҳои KTable ҷараёнҳои навсозиро намояндагӣ мекунанд, бештар ба навсозиҳои пойгоҳи додаҳо монанданд. Андозаи объекти KTable калон намешавад, сабтҳои кӯҳна бо сабтҳои нав иваз карда мешаванд.
  • Объектҳои KTable барои амалиёти ҷамъкунӣ заруранд.
  • Бо истифода аз амалиёти тиреза, шумо метавонед маълумоти ҷамъшударо ба сатилҳои вақт тақсим кунед.
  • Бо шарофати объектҳои GlobalKTable, шумо метавонед маълумоти истинодро дар ҳама ҷо дар барнома, новобаста аз тақсимот дастрас кунед.
  • Пайвастшавӣ байни объектҳои KStream, KTable ва GlobalKTable имконпазир аст.

То ҳол, мо ба сохтани барномаҳои Kafka Streams бо истифода аз сатҳи баланди KStream DSL тамаркуз кардем. Гарчанде ки равиши сатҳи баланд ба шумо имкон медиҳад, ки барномаҳои дақиқ ва мухтасар эҷод кунед, аммо истифодаи он як комёбиро ифода мекунад. Кор бо DSL KStream маънои зиёд кардани мухтасарии рамзи худро тавассути коҳиш додани дараҷаи назорат дорад. Дар боби оянда, мо ба API гиреҳи коркардкунандаи сатҳи паст назар мекунем ва дигар усулҳои муомилотро санҷем. Барномаҳо назар ба пештара дарозтар хоҳанд буд, аммо мо метавонем қариб ҳама гиреҳи коркардкунандаеро, ки ба мо лозим аст, эҷод кунем.

→ Тафсилоти бештарро дар бораи китоб метавонед дар ин ҷо пайдо кунед вебсайти ношир

→ Барои Habrozhiteli 25% тахфиф бо истифода аз купон - Ҷараёни Кафка

→ Ҳангоми пардохт барои нусхаи коғазии китоб китоби электронӣ тавассути почтаи электронӣ фиристода мешавад.

Манбаъ: will.com

Илова Эзоҳ