ቪየናኔት፡ ለኋለኛ ክፍል የቤተ-መጻህፍት ስብስብ። ክፍል 2

የ Raiffeisenbank .NET ገንቢ ማህበረሰብ የቪየናኔትን ይዘቶች ባጭሩ መገምገሙን ቀጥሏል። ወደዚህ እንዴት እና ለምን እንደመጣን ፣ የመጀመሪያውን ክፍል ማንበብ ይችላሉ.

በዚህ ጽሑፍ ውስጥ፣ በእኛ GitHub ማከማቻ ውስጥ ሊገኙ ከሚችሉ ከተከፋፈሉ ግብይቶች፣ ወረፋዎች እና የውሂብ ጎታዎች ጋር ለመስራት ገና ሊታሰቡ የማይችሉ ቤተ-መጻሕፍት ውስጥ እናልፋለን።ምንጮች እዚህ አሉ።) ፣ እና እዚህ Nuget ጥቅሎች.

ቪየናኔት፡ ለኋለኛ ክፍል የቤተ-መጻህፍት ስብስብ። ክፍል 2

ቪየናኔት.ሳጋስ

አንድ ፕሮጀክት ወደ ዲዲዲ እና ማይክሮ ሰርቪስ አርክቴክቸር ሲቀየር፣ ከዚያም የንግድ ሥራ አመክንዮ በተለያዩ አገልግሎቶች ሲሰራጭ፣ የተከፋፈለ የግብይት ዘዴን ከመተግበሩ ጋር ተያይዞ ችግር ይፈጠራል፣ ምክንያቱም ብዙ ሁኔታዎች ብዙ ጊዜ ብዙ ጎራዎችን በአንድ ጊዜ ይጎዳሉ። ከእንደዚህ አይነት ዘዴዎች ጋር በበለጠ ዝርዝር መተዋወቅ ይችላሉ ፣ ለምሳሌ ፣ ክሪስ ሪቻርድሰን "ማይክሮ ሰርቪስ ቅጦች" በሚለው መጽሐፍ ውስጥ.

በፕሮጀክቶቻችን ውስጥ ቀላል ነገር ግን ጠቃሚ ዘዴን ተግባራዊ አድርገናል፡ ሳጋ ወይም ይልቁንም ኦርኬስትራ ላይ የተመሰረተ ሳጋ። የእሱ ይዘት እንደሚከተለው ነው-በተለያዩ አገልግሎቶች ውስጥ ሥራዎችን በቅደም ተከተል ማከናወን አስፈላጊ የሆነበት የተወሰነ የንግድ ሥራ ሁኔታ አለ ፣ እና በማንኛውም ደረጃ ላይ ችግሮች ቢከሰቱ ፣ ለቀደሙት እርምጃዎች ሁሉ የመመለሻ ሂደቱን መደወል አስፈላጊ ነው ። የቀረበ ነው። ስለዚህ, በሳጋው መጨረሻ, ስኬት ምንም ይሁን ምን, በሁሉም ጎራዎች ውስጥ ወጥነት ያለው ውሂብ እንቀበላለን.

የእኛ አተገባበር አሁንም በመሠረታዊ መልኩ የተሠራ ነው እና ከሌሎች አገልግሎቶች ጋር ማንኛውንም የግንኙነት ዘዴዎች ከመጠቀም ጋር የተያያዘ አይደለም. ለመጠቀም አስቸጋሪ አይደለም፡ የመሠረት አብስትራክት ክፍልን ዘር ያድርጉ SagaBase<T>፣ ቲ ለሳጋው ስራ አስፈላጊ የሆነውን የመጀመሪያ ውሂብ እና እንዲሁም አንዳንድ መካከለኛ ውጤቶችን የሚያከማቹበት የአውድ ክፍልዎ ነው። የዐውደ-ጽሑፉ ምሳሌ በአፈፃፀም ጊዜ ወደ ሁሉም ደረጃዎች ይተላለፋል። ሳጋ ራሱ አገር አልባ ክፍል ነው፣ ስለዚህ ምሳሌው በዲአይኤ ውስጥ እንደ ነጠላ ቶን አስፈላጊ የሆኑ ጥገኞችን ለማግኘት ሊቀመጥ ይችላል።

ምሳሌ ማስታወቂያ፡-

public class ExampleSaga : SagaBase<ExampleContext>
{
  public ExampleSaga()
  {
    Step("Step 1")
      .WithAction(c => ...)
      .WithCompensation(c => ...);
	
    AsyncStep("Step 2")
      .WithAction(async c => ...);
  }
}

ምሳሌ ይደውሉ፡

var saga = new ExampleSaga();
var context = new ExampleContext();
await saga.Execute(context);

የተለያዩ አተገባበር ሙሉ ምሳሌዎች ሊታዩ ይችላሉ። እዚህ እና በስብሰባ ላይ ፈተናዎች.

ቪየናኔት.ኦርም.*

በNhibernate በኩል ከተለያዩ የውሂብ ጎታዎች ጋር ለመስራት የቤተ-መጽሐፍት ስብስብ። እኛ Liquibase ን በመጠቀም DB-First አቀራረብን እንጠቀማለን, ስለዚህ ዝግጁ በሆነ የውሂብ ጎታ ውስጥ ከውሂብ ጋር ለመስራት ብቻ ተግባራዊነት አለ.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - መሰረታዊ መገናኛዎችን እና አተገባበርን የያዙ ዋና ዋና ስብሰባዎች ፣ ይዘታቸውን በበለጠ ዝርዝር እንመልከት።

በይነገጽ IEntityFactoryService እና አተገባበሩ EntityFactoryService ከመረጃ ቋቱ ጋር ለመስራት ዋና መነሻዎች ናቸው ፣ ከስራ ክፍል ፣ ከተወሰኑ አካላት ጋር ለመስራት ማከማቻዎች ፣ እንዲሁም የትዕዛዝ አስፈፃሚዎች እና ቀጥተኛ የ SQL ጥያቄዎች እዚህ ተፈጥረዋል። አንዳንድ ጊዜ የአንድ ክፍልን ከዳታቤዝ ጋር ለመስራት ያለውን አቅም ለመገደብ ምቹ ነው, ለምሳሌ, መረጃን የማንበብ ችሎታን ለማቅረብ. ለእንደዚህ አይነት ጉዳዮች IEntityFactoryService ቅድመ አያት አለ - በይነገጽ IEntityRepositoryFactoryማከማቻዎችን የመፍጠር ዘዴን ብቻ የሚያውጅ።

የውሂብ ጎታውን በቀጥታ ለመድረስ የአቅራቢው ዘዴ ጥቅም ላይ ይውላል. በቡድኖቻችን ውስጥ የምንጠቀመው እያንዳንዱ ዲቢኤምኤስ የራሱ ትግበራ አለው፡ ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

በተመሳሳይ ጊዜ በርካታ አቅራቢዎች በአንድ ጊዜ በአንድ መተግበሪያ ውስጥ ሊመዘገቡ ይችላሉ, ይህም ለምሳሌ በአንድ አገልግሎት ማዕቀፍ ውስጥ, መሠረተ ልማትን ለማሻሻል ምንም ወጪ ሳይኖር, ደረጃ በደረጃ ስደትን ለማካሄድ ያስችላል. አንድ DBMS ወደ ሌላ. አስፈላጊውን ግንኙነት የመምረጥ ዘዴ እና, ስለዚህ, ለአንድ የተወሰነ አካል ክፍል አቅራቢው (በመረጃ ቋት ሰንጠረዦች ላይ የካርታ ስራ የተጻፈበት) ህጋዊ አካልን በ BoundedContext ክፍል ውስጥ በመመዝገብ (የጎራ አካላትን ለመመዝገብ ዘዴን ይዟል) ወይም ተተኪው ይተገበራል. አፕሊኬሽኑ ኮንቴክስት (የመተግበሪያ አካላትን ፣ ቀጥተኛ ጥያቄዎችን እና ትዕዛዞችን የመመዝገቢያ ዘዴዎችን ይዟል) ከውቅሩ የግንኙነት መለያ እንደ መከራከሪያ ተቀባይነት ያለው

"db": [
  {
    "nick": "mssql_connection",
    "dbServerType": "MSSQL",
    "ConnectionString": "...",
    "useCallContext": true
  },
  {
    "nick": "oracle_connection",
    "dbServerType": "Oracle",
    "ConnectionString": "..."
  }
],

ምሳሌ ትግበራ አውድ፡-

internal sealed class DbContext : ApplicationContext
{
  public DbContext()
  {
    AddEntity<SomeEntity>("mssql_connection");
    AddEntity<MigratedSomeEntity>("oracle_connection");
    AddEntity<AnotherEntity>("oracle_connection");
  }
}

የግንኙነት መታወቂያው ካልተገለጸ, "ነባሪ" የሚባል ግንኙነት ጥቅም ላይ ይውላል.

የህጋዊ አካላት ቀጥተኛ ካርታ ወደ ዳታቤዝ ሰንጠረዦች መደበኛ የNHibernate መሳሪያዎችን በመጠቀም ይተገበራል። መግለጫውን ሁለቱንም በ xml ፋይሎች እና በክፍሎች መጠቀም ይችላሉ። በዩኒት ፈተናዎች ውስጥ ለግጭት ማከማቻዎች ምቹ ለመጻፍ፣ ላይብረሪ አለ። ViennaNET.TestUtils.Orm.

የ ViennaNET.Orm.* አጠቃቀም ሙሉ ምሳሌዎችን ማግኘት ይቻላል። እዚህ.

ቪየናኔት.መልዕክት መላላኪያ።*

ከወረፋዎች ጋር ለመስራት የቤተ-መጻህፍት ስብስብ።

ከወረፋዎች ጋር ለመስራት፣ እንደ የተለያዩ ዲቢኤምኤስ ተመሳሳይ አካሄድ ተመርጧል፣ ማለትም፣ ከቤተ-መጽሐፍት ጋር አብሮ በመስራት ረገድ የሚቻለው ከፍተኛው የተቀናጀ አካሄድ፣ ምንም አይነት የወረፋ አስተዳዳሪ ምንም ይሁን ምን። ቤተ መፃህፍት ViennaNET.Messaging ለዚህ ውህደት በትክክል ተጠያቂ ነው, እና ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue ለ IBM MQ፣ RabbitMQ እና Kafka በቅደም ተከተል አስማሚ አተገባበርን ይዟል።

ከወረፋዎች ጋር ሲሰሩ ሁለት ሂደቶች አሉ-መልዕክት መቀበል እና መላክ.

መቀበልን አስቡበት። ለቀጣይ ማዳመጥ እና ነጠላ መልእክት ለመቀበል 2 አማራጮች አሉ። ወረፋውን ያለማቋረጥ ለማዳመጥ በመጀመሪያ የተወረሰውን የአቀነባባሪ ክፍል መግለጽ አለብዎት IMessageProcessor, የሚመጣውን መልእክት ለማስኬድ ሃላፊነት የሚወስደው. በመቀጠል፣ ከተወሰነ ወረፋ ጋር “መያያዝ” አለበት፤ ይህ የሚደረገው በመመዝገብ ነው። IQueueReactorFactory የወረፋ መለያውን ከውቅሩ በማመልከት፡-

"messaging": {
    "ApplicationName": "MyApplication"
},
"rabbitmq": {
    "queues": [
      {
        "id": "myQueue",
        "queuename": "lalala",
        ...
      }
    ]
},

የማዳመጥ መጀመሪያ ምሳሌ፡-

_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();

ከዚያም አገልግሎቱ ሲጀምር እና ማዳመጥ ለመጀመር ዘዴው ሲጠራ, ከተጠቀሰው ወረፋ የሚመጡ መልዕክቶች በሙሉ ወደ ተጓዳኝ ፕሮሰሰር ይሄዳሉ.

በፋብሪካ በይነገጽ ውስጥ አንድ መልእክት ለመቀበል IMessagingComponentFactory የሚለው ዘዴ አለ። CreateMessageReceiverከተጠቀሰው ወረፋ መልእክት የሚጠብቅ ተቀባይ ይፈጥራል፡-

using (var receiver = _messagingComponentFactory.CreateMessageReceiver<TestMessage>("myQueue"))
{
    var message = receiver.Receive();
}

መልእክት ለመላክ ተመሳሳይ መጠቀም ያስፈልግዎታል IMessagingComponentFactory እና መልእክት ላኪ ይፍጠሩ፡-

using (var sender = _messagingComponentFactory.CreateMessageSender<MyMessage>("myQueue"))
{
    sender.SendMessage(new MyMessage { Value = ...});
}

መልእክትን ለመከታተል እና ለማሰናከል ሶስት ዝግጁ የሆኑ አማራጮች አሉ፡ የጽሁፍ መልእክት ብቻ፣ XML እና JSON፣ አስፈላጊ ከሆነ ግን በቀላሉ የእራስዎን የበይነገጽ አተገባበር መስራት ይችላሉ። IMessageSerializer и IMessageDeserializer.

የእያንዳንዱን ወረፋ አስተዳዳሪ ልዩ ችሎታዎች ለመጠበቅ ሞክረናል, ለምሳሌ. ViennaNET.Messaging.MQSeriesQueue ጽሑፍን ብቻ ሳይሆን ባይት መልዕክቶችን እንዲልኩ ይፈቅድልዎታል ፣ እና ViennaNET.Messaging.RabbitMQQueue ማዞሪያ እና በበረራ ላይ ወረፋን ይደግፋል። ለ RabbitMQ የኛ አስማሚ መጠቅለያ እንዲሁ የ RPCን አንዳንድ ተመሳሳይነት ይተገበራል፡ መልእክት እንልካለን እና ለአንድ ምላሽ መልእክት ብቻ የተፈጠረውን ልዩ ጊዜያዊ ወረፋ ምላሽ እንጠብቃለን።

እዚህ ከመሠረታዊ የግንኙነት ልዩነቶች ጋር ወረፋዎችን የመጠቀም ምሳሌ.

ViennaNET.CallContext

ወረፋዎችን የምንጠቀመው በተለያዩ ስርዓቶች መካከል ለመዋሃድ ብቻ ሳይሆን በተመሳሳዩ አፕሊኬሽን ማይክሮ ሰርቪስ መካከል ለምሳሌ በሳጋ ውስጥ ለመነጋገር ጭምር ነው። ይህም ከመልዕክቱ ጋር እንደ የተጠቃሚ መግቢያ፣ ከጫፍ እስከ ጫፍ መግባት፣ የምንጭ አይፒ አድራሻ እና የፈቃድ ዳታ የመሳሰሉ ረዳት መረጃዎችን ለማስተላለፍ አስፈለገ። የዚህን ውሂብ ማስተላለፍ ተግባራዊ ለማድረግ, ቤተ-መጽሐፍት አዘጋጅተናል ViennaNET.CallContext, ይህም ወደ አገልግሎቱ ከገባ ጥያቄ ውሂብ እንዲያከማቹ ያስችልዎታል. በዚህ ጉዳይ ላይ ጥያቄው በወረፋ ወይም በኤችቲቲፒ በኩል እንዴት እንደቀረበ ምንም ችግር የለውም። ከዚያም የወጪ ጥያቄውን ወይም መልዕክቱን ከመላክዎ በፊት ውሂቡ ከዐውደ-ጽሑፉ ተወስዶ በራስጌዎች ውስጥ ይቀመጣል። ስለዚህ, የሚቀጥለው አገልግሎት ረዳት መረጃዎችን ይቀበላል እና በተመሳሳይ መንገድ ያስተዳድራል.

ስለ እርስዎ ትኩረት እናመሰግናለን ፣ አስተያየትዎን በጉጉት እንጠብቃለን እና ጥያቄዎችን ይጎትቱ!

ምንጭ: hab.com

አስተያየት ያክሉ