በአክሰን በኩል ከግንኙነት ጋር የማይክሮ አገልግሎቶች

በዚህ ቀላል አጋዥ ስልጠና በስፕሪንግ ቡት ውስጥ ሁለት ማይክሮ ሰርቪስ እንሰራለን እና በመካከላቸው መስተጋብርን በአክሶን ማእቀፍ በኩል እናደራጃለን።

በአክሰን በኩል ከግንኙነት ጋር የማይክሮ አገልግሎቶች


እንዲህ ያለ ተግባር አለን እንበል።

በአክሲዮን ገበያ ውስጥ የግብይቶች ምንጭ አለ። ይህ ምንጭ በእረፍት በይነገጽ በኩል ወደ እኛ ግብይቶችን ያስተላልፋል።

እነዚህን ግብይቶች መቀበል፣ በመረጃ ቋት ውስጥ ማስቀመጥ እና ምቹ የማህደረ ትውስታ ማከማቻ መፍጠር አለብን።

ይህ ማከማቻ የሚከተሉትን ተግባራት ማከናወን አለበት፡-

  • የንግዶች ዝርዝር መመለስ;
  • ሙሉ ቦታውን ይመልሱ, ማለትም. ሰንጠረዥ "መሳሪያ" - "የአሁኑ የዋስትናዎች ብዛት";
  • ለተጠቀሰው መሳሪያ ቦታ ይመልሱ.

ይህንን ችግር እንዴት እንቀርባለን?

በማይክሮ አገልግሎት ፋሽን መመሪያዎች መሠረት ተግባሩን ወደ ማይክሮ አገልግሎት ክፍሎች መከፋፈል አለብን-

  • የእረፍት ግብይት መቀበል;
  • ግብይቱን ወደ የውሂብ ጎታ ማስቀመጥ;
  • መረጃን በአቀማመጥ ለማቅረብ የማህደረ ትውስታ ማከማቻ።

በዚህ አጋዥ ስልጠና ማዕቀፍ ውስጥ የመጀመሪያውን እና ሶስተኛውን አገልግሎት እናድርግ, ሁለተኛውን ለሁለተኛው ክፍል እንተወዋለን (ይህ አስደሳች ከሆነ በአስተያየቶቹ ውስጥ ይፃፉ).

ስለዚህ ሁለት ጥቃቅን አገልግሎቶች አሉን.

የመጀመሪያው ከውጭ ውሂብ ይቀበላል.

ሁለተኛው ይህንን ውሂብ ያስኬዳል እና ለገቢ ጥያቄዎች ምላሽ ይሰጣል።

እርግጥ ነው, አግድም መመዘን, የማያቋርጥ ማሻሻያ እና ሌሎች የጥቃቅን አገልግሎቶችን ጥቅሞች ማግኘት እንፈልጋለን.

ከፊት ለፊታችን በጣም ከባድ ሥራ ምንድን ነው?

እንደ እውነቱ ከሆነ, ብዙዎቹ አሉ, አሁን ግን በእነዚህ ጥቃቅን አገልግሎቶች መካከል መረጃ እንዴት እንደሚፈስ እንነጋገር. በተጨማሪም በእነሱ መካከል እረፍት ማድረግ ይችላሉ, አንድ አይነት ወረፋ ማስቀመጥ ይችላሉ, ብዙ ነገሮችን ከራሳቸው ጥቅሞች እና ጉዳቶች ጋር መምጣት ይችላሉ.

አንድ የሚቻል አቀራረብን እንመልከት - አልተመሳሰል መስተጋብር በ Axon ማዕቀፍ.

እንዲህ ዓይነቱ መፍትሔ ምን ጥቅሞች አሉት?

በመጀመሪያ፣ ያልተመሳሰለ መስተጋብር የመተጣጠፍ ችሎታን ይጨምራል (አዎ፣ እዚህ ተቀንሶ አለ፣ ግን አሁን የምንናገረው ስለ ጥቅሞቹ ብቻ ነው)።

በሁለተኛ ደረጃ, ከሳጥኑ ውስጥ በትክክል እናገኛለን የክስተት ምንጭ и CQRS.
በሶስተኛ ደረጃ, Axon ዝግጁ የሆነ መሠረተ ልማት ያቀርባል, እና የንግድ ሥራ አመክንዮ በማዳበር ላይ ብቻ ማተኮር አለብን.

እንጀምር ፡፡

ፕሮጀክታችን በደረጃው ላይ ይሆናል. ሶስት ሞጁሎች ይኖሩታል፡-

  • የተለመደ. የተለመዱ የውሂብ አወቃቀሮች ያለው ሞጁል (ኮፒ-መለጠፍን አንወድም);
  • ነጋዴ ፈጣሪ. በእረፍት በኩል ግብይቶችን ለመቀበል ማይክሮ አገልግሎት ያለው ሞጁል;
  • የንግድ ጥያቄዎች. ሞጁል ከማይክሮ አገልግሎት ጋር ለቦታ ማሳያ።

ስፕሪንግ ቡትን እንደ መሰረት እንውሰድ እና የ Axon ማስጀመሪያውን እናገናኘው።

አክሰን ያለ ስፕሪንግ ጥሩ ይሰራል፣ ግን አብረን እንጠቀማቸዋለን።

እዚህ ቆም ብለን ስለ አክሰን ጥቂት ቃላት መናገር አለብን።

ይህ የደንበኛ አገልጋይ ስርዓት ነው። አገልጋይ አለ - ይህ የተለየ መተግበሪያ ነው, በ Docker ውስጥ እናሰራዋለን.

እና በማይክሮ ሰርቪስ ውስጥ የተካተቱ ደንበኞች አሉ።
ይህ የምናገኘው ምስል ነው። በመጀመሪያ፣ የአክሶን አገልጋይ (በ Docker) ይጀምራል፣ ከዚያም ማይክሮ አገልግሎቶቻችንን ይጀምራል።

ሲጀመር ማይክሮ ሰርቪስ አገልጋይ ይፈልጉ እና ከእሱ ጋር መስተጋብር ይጀምራሉ። መስተጋብር በሁለት ዓይነቶች ሊከፈል ይችላል-ቴክኒካዊ እና ንግድ.

በቴክኒካዊ መልኩ ይህ የ "እኔ ሕያው ነኝ" መልዕክቶች መለዋወጥ ነው (እንደዚህ ያሉ መልዕክቶች በስህተት ምዝግብ ማስታወሻ ሁነታ ላይ ሊታዩ ይችላሉ).

ንግድ እንደ “አዲስ ስምምነት” ያሉ የመልእክት ልውውጥ ነው።

አንድ ጠቃሚ ባህሪ፡ ከተጀመረ በኋላ ማይክሮ ሰርቪስ የአክሶን አገልጋይ "ምን እንደተፈጠረ" ሊጠይቅ ይችላል እና አገልጋዩ የተከማቹትን ክስተቶች ወደ ማይክሮ ሰርቪስ ይልካል. በዚህ መንገድ ማይክሮ ሰርቪሱ ውሂብ ሳይጠፋ በአንፃራዊነት ደህንነቱ በተጠበቀ ሁኔታ እንደገና መጀመር ይችላል።
በዚህ የልውውጥ እቅድ ብዙ የማይክሮ አገልግሎቶችን በቀላሉ ማስጀመር እንችላለን፣
እና በተለያዩ አስተናጋጆች ላይ.

አዎ፣ የአክሶን አገልጋይ አንድ ምሳሌ አስተማማኝ አይደለም፣ ግን ለአሁን እንደዛ ነው።

በ Event Sourcing እና CQRS ፓራዲሞች ውስጥ እንሰራለን። ይህ ማለት "ትዕዛዞች" "ክስተቶች" እና "ምርጫዎች" ሊኖረን ይገባል.

አንድ ትዕዛዝ ይኖረናል፡ “ስምምነትን ፍጠር”፣ አንድ ክስተት “የተፈጠረ ስምምነት” እና ሶስት ምርጫዎች፡ “ሁሉንም ቅናሾች አሳይ”፣ “አቀማመጥ አሳይ”፣ “ቦታን በመሳሪያ አሳይ”።

የስራ ፍሰቱ ይህን ይመስላል።

  1. የንግድ ፈጣሪ ማይክሮ አገልግሎት የእረፍት ንግድ ይቀበላል።
  2. የነጋዴ ፈጣሪ ማይክሮ ሰርቪስ "ንግድ ፍጠር" ትዕዛዝ ይፈጥራል እና ወደ Axon አገልጋይ ይልካል.
  3. የአክሰን አገልጋዩ ትዕዛዙን ተቀብሎ ትዕዛዙን ወደ ፍላጎት ተቀባይ ያስተላልፋል፣ በእኛ ሁኔታ የንግድ ፈጣሪ ማይክሮ አገልግሎት።
  4. የንግድ ፈጣሪ ማይክሮ አገልግሎት ትዕዛዙን ይቀበላል, "የተፈጠረ ንግድ" ክስተትን ያመነጫል እና ወደ Axon አገልጋይ ይልካል.
  5. የ Axon አገልጋይ ክስተቱን ተቀብሎ ፍላጎት ላላቸው ተመዝጋቢዎች ያስተላልፋል።
  6. አሁን ያለን አንድ ፍላጎት ያለው ተቀባይ ብቻ ነው፡ የ tradeQueries ማይክሮ አገልግሎት።
  7. የ tradeQueries ማይክሮ ሰርቪስ ክስተቱን ይቀበላል እና የውስጥ ውሂቡን ያዘምናል።

(ዝግጅቱ በሚፈጠርበት ጊዜ የንግድ መጠይቆች ማይክሮ አገልግሎት ላይኖር ይችላል, ነገር ግን ልክ እንደጀመረ ወዲያውኑ ክስተቱን ይቀበላል) አስፈላጊ ነው.

አዎ፣ የአክሰን አገልጋዩ በግንኙነቶች መሃል ላይ ነው፣ ሁሉም መልዕክቶች በእሱ ውስጥ ያልፋሉ።

ወደ ኮድ ማውጣት እንሂድ።

ጽሑፉን በኮድ ላለማጨናገፍ ፣ከዚህ በታች ቁርጥራጮችን ብቻ አቀርባለሁ ፣የጠቅላላው ምሳሌ አገናኝ ከዚህ በታች ይሆናል።

በተለመደው ሞጁል በተለመደው እንጀምር.

በውስጡ ያሉት የተለመዱ ክፍሎች ክስተቱ (ክፍል CreatedTradeEvent) ናቸው. ለስሙ ትኩረት ይስጡ, በእውነቱ, ይህ ክስተት የፈጠረው ቡድን ስም ነው, ነገር ግን ባለፈው ጊዜ. ባለፈው, ምክንያቱም በመጀመሪያ አንድ ክስተት እንዲፈጠር የሚያደርግ ትዕዛዝ አለ.

ሌሎች የተለመዱ አወቃቀሮች ቦታን (የክፍል አቀማመጥ) ፣ ንግድ (የመደብ ንግድ) እና የንግድ ጎን (enum Side)ን የሚገልጹ ክፍሎችን ያጠቃልላሉ ፣ ማለትም ። መግዛት ወይም መሸጥ.

ወደ ንግድ ፈጣሪ ሞጁል እንሂድ።

ይህ ሞጁል ንግዶችን ለመቀበል የእረፍት በይነገጽ (ክፍል ትሬድ መቆጣጠሪያ) አለው።
ከተቀበለው ውል, "የፍጠራ ስምምነት" ትዕዛዝ ተፈጥሯል እና ወደ axon አገልጋይ ይላካል.

    @PostMapping("/trade")
    public ResponseEntity<String> create(@RequestBody Trade trade) {
        var createTradeCommand = CreateTradeCommand.builder()
                .tradeId(trade.getTradeId())
	...
                .build();
        var result = commandGateway.sendAndWait(createTradeCommand, 3, TimeUnit.SECONDS);
        return ResponseEntity.ok(result.get().toString());
    }

ትዕዛዙን ለማስኬድ ክፍል TradeAggregate ጥቅም ላይ ይውላል።
Axon እንዲያገኘው የ@Aggregate ማብራሪያን አስቀምጠናል።
ትዕዛዙን የማስኬድ ዘዴው ይህንን ይመስላል (አጭሩ)

    @CommandHandler
    public TradeAggregate(CreateTradeCommand command) {
        log.info("command: {}", command);
        var event = CreatedTradeEvent.builder()
                .tradeId(command.tradeId())
		....
                .build();
        AggregateLifecycle.apply(event);
    }

አንድ ክስተት ከትእዛዙ ይመነጫል እና ወደ አገልጋዩ ይላካል።
ትዕዛዙ በ CreateTradeCommand ክፍል ውስጥ ነው.

አሁን የመጨረሻውን የንግድ መጠየቂያ ሞጁል እንይ።

ምርጫዎች በጥያቄዎች ጥቅል ውስጥ ተገልጸዋል.
ይህ ሞጁል የእረፍት በይነገጽም አለው።
የህዝብ ክፍል TradeController.

ለምሳሌ፣ ጥያቄውን ለማስኬድ እንይ፡ “ሁሉንም ግብይቶች አሳይ”።

    @GetMapping("/trade/all")
    public List<Trade> findAllTrades() {
        return queryGateway.query(new FindAllTradesQuery(),
                ResponseTypes.multipleInstancesOf(Trade.class)).join();
    }

የማምጣት ጥያቄ ተፈጥሯል እና ወደ አገልጋዩ ይላካል።

የTradesEventHandler ክፍል የማምጣት ጥያቄን ለማስኬድ ስራ ላይ ይውላል።
በማብራሪያ ምልክት የተደረገበት ዘዴ አለው

   @QueryHandler
    public List<Position> handleFindCurrentPositionQuery(FindCurrentPositionQuery query)

ከውስጥ ማህደረ ትውስታ ማከማቻ መረጃን የማውጣት ሃላፊነት ያለው እሱ ነው።

በዚህ ማከማቻ ውስጥ ያለው መረጃ እንዴት እንደሚዘመን ጥያቄው ይነሳል።

ይህ ለተወሰኑ ናሙናዎች የተዘጋጀ የConcurrentHashMap ስብስብ በመሆኑ እንጀምር።
እነሱን ለማዘመን የሚከተለውን ዘዴ ይጠቀሙ።

    @EventHandler
    public void on(CreatedTradeEvent event) {
        log.info("event:{}", event);

        var trade = Trade.builder()
	...
                .build();
        trades.put(event.tradeId(), trade);
        position.merge(event.shortName(), event.size(),
                (oldValue, value) -> event.side() == Side.BUY ? oldValue + value : oldValue - value);
    }

"የተፈጠረ ስምምነት" ክስተት ይቀበላል እና ካርታዎችን ያዘምናል.

እነዚህ የማይክሮ ሰርቪስ ልማት ዋና ዋና ነጥቦች ናቸው.

ስለ Axon ድክመቶች ምን ማለት ይችላሉ?

በመጀመሪያ ፣ ይህ የመሠረተ ልማት ውስብስብ ነው ፣ የውድቀት ነጥብ ታየ - የአክሰን አገልጋይ ፣ ሁሉም ግንኙነቶች በእሱ ውስጥ ያልፋሉ።

በሁለተኛ ደረጃ, እንደዚህ ያሉ የተከፋፈሉ ስርዓቶች ጉዳቱ በጣም በግልጽ ይታያል - ጊዜያዊ የውሂብ አለመመጣጠን. በእኛ ሁኔታ፣ አዲስ ስምምነት በመቀበል እና የናሙናዎችን መረጃ በማዘመን መካከል ተቀባይነት የሌለው ረጅም ጊዜ ሊያልፍ ይችላል።

ከትዕይንቱ በስተጀርባ ምን ቀረ?

ስለ Event Sourcing እና CQRS፣ ምን እንደሆነ እና ምን እንደሚያስፈልግ በጭራሽ ምንም አልተነገረም።
እነዚህን ጽንሰ-ሐሳቦች ሳይገልጹ አንዳንድ ነጥቦች ግልጽ ላይሆኑ ይችላሉ.

ምናልባት የግለሰብ ኮድ ቁርጥራጮች እንዲሁ ማብራሪያ ያስፈልጋቸዋል።

ስለዚህ ጉዳይ በ ላይ እንነጋገራለን ዌቢናርን ይክፈቱ ሴፕቴምበር 21.

ሙሉ ምሳሌ.

ምንጭ: hab.com