ViennaNET- နောက်ခံဖိုင်အတလက် စာကဌည့်တိုက်မျာသ။ အပိုင်သ 2

Raiffeisenbank .NET developer အသိုင်သအဝိုင်သသည် ViennaNET ၏ အကဌောင်သအရာမျာသကို အကျဉ်သချုံသ သုံသသပ်နေပါသည်။ ဒီကို ဘယ်လိုရောက်လာတာလဲ၊ ပထမပိုင်သကို သင်ဖတ်နိုင်ပါတယ်။.

ကဆောင်သပါသတလင်၊ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ GitHub repository တလင်တလေ့ရဟိနိုင်သည့် ဖဌန့်ဝေထာသသော ငလေပေသငလေယူမျာသ၊ တန်သစီခဌင်သမျာသနဟင့် ဒေတာဘေ့စ်မျာသဖဌင့် လုပ်ဆောင်ရန်အတလက် မစဉ်သစာသရသေသသော စာကဌည့်တိုက်မျာသကို ဖဌတ်သန်သသလာသပါမည်။သတင်သရင်သမဌစ်တလေက ဒီမဟာ), ပဌီသတော့ Nuget packages လေသပါ။.

ViennaNET- နောက်ခံဖိုင်အတလက် စာကဌည့်တိုက်မျာသ။ အပိုင်သ 2

ViennaNET.Sagas

ပရောဂျက်တစ်ခုသည် DDD နဟင့် microservice ဗိသုကာသို့ပဌောင်သသောအခါ၊ ကလဲပဌာသသောဝန်ဆောင်မဟုမျာသပေါ်တလင် လုပ်ငန်သဆိုင်ရာယုတ္တိကို ဖဌန့်ဝေသောအခါ၊ ခလဲဝေပေသငလေယူယန္တရာသတစ်ခုကို အကောင်အထည်ဖော်ရန် လိုအပ်ခဌင်သ၊ နယ်ပယ်မျာသစလာသည် ဒိုမိန်သမျာသစလာကို တစ်ချိန်တည်သတလင် သက်ရောက်မဟုရဟိတတ်သောကဌောင့် ပဌဿနာတစ်ခုဖဌစ်ပေါ်လာပါသည်။ ဥပမာအာသဖဌင့်၊ "Microservices Patterns" စာအုပ်တလင် Chris Richardson ဖဌစ်သည်။.

ကျလန်ုပ်တို့၏ပရောဂျက်မျာသတလင်၊ ကျလန်ုပ်တို့သည် ရိုသရဟင်သသော်လည်သ အသုံသဝင်သော ယန္တရာသတစ်ခု- ဇာတ်လမ်သတစ်ခု သို့မဟုတ် တီသမဟုတ်မဟုအခဌေခံသည့် ဇာတ်လမ်သတစ်ခုဖဌစ်သည်။ ၎င်သ၏အနဟစ်သာရမဟာ အောက်ပါအတိုင်သဖဌစ်သည်- မတူညီသောဝန်ဆောင်မဟုမျာသတလင် ဆက်တိုက်လုပ်ဆောင်ရန် လိုအပ်သည့် လုပ်ငန်သအခဌေအနေတစ်ခုရဟိပဌီသ၊ မည်သည့်အဆင့်တလင်မဆို ပဌဿနာမျာသပေါ်ပေါက်ပါက၊ ၎င်သတည်ရဟိရာနေရာအာသလုံသအတလက် rollback လုပ်ထုံသလုပ်နည်သကို ခေါ်ရန် လိုအပ်ပါသည်။ ပေသထာသသည်။ ထို့ကဌောင့်၊ အောင်မဌင်မဟုမခလဲခဌာသဘဲ ဇာတ်လမ်သ၏အဆုံသတလင်၊ ကျလန်ုပ်တို့သည် ဒိုမိန်သအာသလုံသတလင် တစ်သမတ်တည်သဒေတာကို လက်ခံရရဟိပါသည်။

ကျလန်ုပ်တို့၏ အကောင်အထည်ဖော်မဟုကို ၎င်သ၏အခဌေခံပုံစံဖဌင့် ပဌုလုပ်ထာသဆဲဖဌစ်ပဌီသ အခဌာသဝန်ဆောင်မဟုမျာသနဟင့် အပဌန်အလဟန်တုံ့ပဌန်သည့်နည်သလမ်သမျာသကို အသုံသပဌုခဌင်သနဟင့် မသက်ဆိုင်ပါ။ အသုံသပဌုရန်မခက်ခဲပါ- T သည် saga အလုပ်လုပ်ရန်အတလက် လိုအပ်သော ကနညသဒေတာအပဌင် အလယ်အလတ်ရလဒ်အချို့ကို သိမ်သဆည်သထာသနိုင်သည့် အခဌေခံ စိတ္တဇအတန်သ SagaBase<T> မဟ ဆင်သသက်လာစေသည်။ လုပ်ဆောင်နေစဉ်အတလင်သ ဆက်စပ်ဥပမာကို အဆင့်အာသလုံသသို့ ဖဌတ်သလာသပါမည်။ Saga ကိုယ်တိုင်သည် နိုင်ငံမဲ့လူတန်သစာသဖဌစ်သောကဌောင့် လိုအပ်သောမဟီခိုမဟုမျာသရရဟိရန် DI တလင် Singleton အဖဌစ်ထာသရဟိနိုင်ပါသည်။

နမူနာကဌော်ငဌာ-

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);

မတူညီသော အကောင်အထည်ဖော်မဟုမျာသ၏ နမူနာအပဌည့်အစုံကို ကဌည့်ရဟုနိုင်ပါသည်။ ဒီမဟာ အသင်သတော်၌၎င်သ၊ စမ်သသပ်မဟုမျာသ.

ViennaNET.Orm.*

Nhibernate မဟတဆင့် အမျိုသမျိုသသော ဒေတာဘေ့စ်မျာသနဟင့် လုပ်ဆောင်ရန်အတလက် စာကဌည့်တိုက်မျာသ အစုံ။ ကျလန်ုပ်တို့သည် Liquibase ကို အသုံသပဌု၍ DB-First ချဉ်သကပ်မဟုကို အသုံသပဌုသည်၊ ထို့ကဌောင့် အဆင်သင့်လုပ်ထာသသော ဒေတာဘေ့စ်တလင် ဒေတာဖဌင့် လုပ်ဆောင်နိုင်သော လုပ်ဆောင်ချက်သာ ရဟိပါသည်။

ViennaNET.Orm.Seedwork О ViennaNET.Orm - အခဌေခံ အင်တာဖေ့စ်မျာသနဟင့် ၎င်သတို့၏ အကောင်အထည်ဖော်မဟုမျာသ အသီသသီသပါရဟိသော အဓိက စည်သဝေသပလဲမျာသ။ သူတို့ရဲ့ အကဌောင်သအရာတလေကို အသေသစိတ် လေ့လာကဌည့်ရအောင်။

interface ကို IEntityFactoryService နဟင့်၎င်သ၏အကောင်အထည်ဖော်မဟု EntityFactoryService အလုပ်ယူနစ်၊ သီသခဌာသ entities မျာသနဟင့် အလုပ်လုပ်ရန်အတလက် repositories မျာသအပဌင် commands ၏ executors နဟင့် direct SQL queries မျာသကို ကနေရာတလင် ဖန်တီသထာသသောကဌောင့် database နဟင့်အလုပ်လုပ်ခဌင်သအတလက် အဓိကအစအချက်ဖဌစ်သည်။ တခါတရံတလင် Data မျာသကိုသာဖတ်ရဟုနိုင်စေရန်၊ ဥပမာအာသဖဌင့် database တစ်ခုနဟင့်အလုပ်လုပ်ရန်အတလက် class တစ်ခု၏စလမ်သရည်မျာသကိုကန့်သတ်ရန်အဆင်ပဌေသည်။ ဒီလိုကိစ္စတလေအတလက် IEntityFactoryService ဘိုသဘေသ - interface တစ်ခုရဟိသည်။ IEntityRepositoryFactoryrepositories ဖန်တီသခဌင်သအတလက် နည်သလမ်သတစ်ခုသာ ကဌေငဌာသည်။

ဒေတာဘေ့စ်ကို တိုက်ရိုက်ဝင်ရောက်ရန်၊ ဝန်ဆောင်မဟုပေသသည့် ယန္တရာသကို အသုံသပဌုသည်။ ကျလန်ုပ်တို့၏အဖလဲ့မျာသတလင်အသုံသပဌုသည့် DBMS တစ်ခုစီတလင် ၎င်သ၏ကိုယ်ပိုင်အကောင်အထည်ဖော်မဟုရဟိသည်။ ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

တစ်ချိန်တည်သမဟာပင်၊ ဝန်ဆောင်မဟုပေသသူအမျာသအပဌာသသည် အပလီကေသရဟင်သတစ်ခုတလင် တစ်ချိန်တည်သတလင် စာရင်သသလင်သနိုင်ပဌီသ၊ ဥပမာအာသဖဌင့်၊ အခဌေခံအဆောက်အအုံကို ပဌုပဌင်မလမ်သမံခဌင်သအတလက် ကုန်ကျစရိတ်မရဟိဘဲ၊ ဝန်ဆောင်မဟုတစ်ခု၏ မူဘောင်အတလင်သမဟ တစ်ဆင့်ပဌီသတစ်ဆင့် ရလဟေ့ပဌောင်သခဌင်သကို လုပ်ဆောင်နိုင်စေပါသည်။ DBMS တစ်ခုမဟ နောက်တစ်ခု။ လိုအပ်သောချိတ်ဆက်မဟုကိုရလေသချယ်ခဌင်သအတလက်ယန္တရာသနဟင့်၊ ထို့ကဌောင့်၊ သီသခဌာသentity အတန်သအတလက်ပံ့ပိုသပေသသူ (ဒေတာဘေ့စ်ဇယာသမျာသသို့မဌေပုံဆလဲခဌင်သအတလက်ရေသသာသထာသသည်) သည် BoundedContext အတန်သတလင်entity ကိုစာရင်သသလင်သခဌင်သ (ဒိုမိန်သအရာမျာသကိုမဟတ်ပုံတင်ရန်နည်သလမ်သတစ်ခုပါရဟိသည်) သို့မဟုတ်၎င်သ၏ဆက်ခံသူ ApplicationContext (အပလီကေသရဟင်သအဖလဲ့အစည်သမျာသ၊ တိုက်ရိုက်တောင်သဆိုမဟုမျာသနဟင့် အမိန့်မျာသ မဟတ်ပုံတင်ခဌင်သအတလက် နည်သလမ်သမျာသ ပါ၀င်သည်)၊ ဖလဲ့စည်သမဟုပုံစံမဟ ချိတ်ဆက်မဟုအမဟတ်အသာသကို အကဌောင်သပဌချက်တစ်ခုအဖဌစ် လက်ခံသည်-

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

ဥပမာ ApplicationContext-

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

ချိတ်ဆက်မဟု ID ကို မသတ်မဟတ်ထာသပါက "default" ဟု အမည်ပေသထာသသည့် ချိတ်ဆက်မဟုကို အသုံသပဌုပါမည်။

ဒေတာဘေ့စ်ဇယာသမျာသထံ တိုက်ရိုက်မဌေပုံဆလဲခဌင်သကို စံ NHibernate ကိရိယာမျာသကို အသုံသပဌု၍ အကောင်အထည်ဖော်သည်။ ဖော်ပဌချက်ကို xml ဖိုင်မျာသမဟတစ်ဆင့်လည်သကောင်သ၊ အတန်သမျာသမဟတစ်ဆင့်လည်သကောင်သ သင်အသုံသပဌုနိုင်ပါသည်။ Unit tests တလင် stub repositories ကို အဆင်ပဌေပဌေ ရေသသာသနိုင်စေရန်အတလက် Library တစ်ခု ရဟိပါသည်။ ViennaNET.TestUtils.Orm.

ViennaNET.Orm.* အသုံသပဌုခဌင်သ၏ နမူနာအပဌည့်အစုံကို တလေ့နိုင်ပါသည်။ ဒီမဟာ.

ViennaNET.စာတိုပေသပို့ခဌင်သ။*

တန်သစီခဌင်သမျာသဖဌင့် လုပ်ဆောင်နိုင်သော စာကဌည့်တိုက်မျာသ။

တန်သစီခဌင်သမျာသဖဌင့်လုပ်ဆောင်ရန်၊ တန်သစီမန်နေဂျာကိုအသုံသပဌုသည်ဖဌစ်စေ၊ တန်သစီမန်နေဂျာကိုအသုံသပဌုသည်ဖဌစ်စေ စာကဌည့်တိုက်နဟင့်လုပ်ဆောင်ရာတလင် အမျာသဆုံသဖဌစ်နိုင်ချေရဟိသော ပေါင်သစပ်ချဉ်သကပ်နည်သကို DBMS အမျိုသမျိုသဖဌင့် တူညီသောချဉ်သကပ်နည်သကို ရလေသချယ်ခဲ့သည်။ စာကဌည့်တိုက် ViennaNET.Messaging ကစည်သလုံသညီညလတ်မဟုအတလက် အတိအကျ တာဝန်ရဟိပါသည်။ ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue О ViennaNET.Messaging.KafkaQueue IBM MQ၊ RabbitMQ နဟင့် Kafka အတလက် adapter အကောင်အထည်ဖော်မဟုမျာသ အသီသသီသ ပါဝင်ပါသည်။

တန်သစီခဌင်သမျာသဖဌင့် လုပ်ဆောင်သည့်အခါ၊ မက်ဆေ့ချ်လက်ခံခဌင်သနဟင့် ပေသပို့ခဌင်သ လုပ်ငန်သစဉ် နဟစ်ခုရဟိသည်။

လက်ခံစဉ်သစာသပါ။ ကနေရာတလင် ရလေသချယ်စရာ 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 စာသာသသာမက byte မက်ဆေ့ခ်ျမျာသကိုပါ ပေသပို့နိုင်စေပါသည်။ ViennaNET.Messaging.RabbitMQQueue လမ်သကဌောင်သလမ်သကဌောင်သနဟင့် ပျံသန်သမဟု တန်သစီခဌင်သကို ပံ့ပိုသပေသသည်။ RabbitMQ အတလက် ကျလန်ုပ်တို့၏ adapter wrapper သည် RPC ၏ ပုံသဏ္ဍာန်အချို့ကိုလည်သ လုပ်ဆောင်သည်- ကျလန်ုပ်တို့သည် မက်ဆေ့ချ်ပို့ပဌီသ တုံ့ပဌန်မဟုမက်ဆေ့ချ်တစ်ခုအတလက်သာ ဖန်တီသထာသသည့် အထူသ ယာယီတန်သစီမဟ တုံ့ပဌန်မဟုကို စောင့်မျဟော်နေပါသည်။

ဒီမဟာ အခဌေခံချိတ်ဆက်မဟု ကလဲပဌာသမဟုမျာသနဟင့်အတူ တန်သစီခဌင်သကို အသုံသပဌုခဌင်သ ဥပမာ.

ViennaNET.CallContext

ကျလန်ုပ်တို့သည် မတူညီသောစနစ်မျာသကဌာသ ပေါင်သစည်သရန်အတလက်သာမက တူညီသောအပလီကေသရဟင်သတစ်ခု၏ microservices မျာသအကဌာသ ဆက်သလယ်မဟုအတလက်လည်သ တန်သစီခဌင်သကို အသုံသပဌုပါသည်။ ၎င်သသည် အသုံသပဌုသူ၏ဝင်ရောက်မဟုကဲ့သို့သော အရန်ဒေတာ၊ အဆုံသမဟအဆုံသမဟတ်တမ်သရယူခဌင်သအတလက် တောင်သဆိုချက်အထောက်အထာသ၊ ရင်သမဌစ် IP လိပ်စာနဟင့် ခလင့်ပဌုချက်ဒေတာတို့ကို မက်ဆေ့ဂျ်နဟင့်အတူ ပေသပို့ရန် လိုအပ်လာသည်။ ကဒေတာကို ထပ်ဆင့်ပေသပို့ခဌင်သအာသ အကောင်အထည်ဖော်ရန်၊ ကျလန်ုပ်တို့သည် စာကဌည့်တိုက်တစ်ခုကို တီထလင်ခဲ့သည်။ ViennaNET.CallContextဝန်ဆောင်မဟုထဲသို့ ဝင်ရောက်သည့် တောင်သဆိုချက်မဟ ဒေတာကို သိမ်သဆည်သနိုင်စေမည့်၊ ကကိစ္စတလင်၊ တန်သစီခဌင်သ သို့မဟုတ် Http မဟတစ်ဆင့် တောင်သဆိုမဟုကို မည်သို့ပဌုလုပ်ခဲ့သည်မဟာ အရေသမကဌီသပါ။ ထို့နောက် အထလက်တောင်သဆိုမဟု သို့မဟုတ် မက်ဆေ့ချ်ကို မပို့မီ၊ အကဌောင်သအရာမဟ အချက်အလက်မျာသကို ထုတ်ယူပဌီသ ခေါင်သစီသမျာသတလင် ထည့်သလင်သပါ။ ထို့ကဌောင့် နောက်ဝန်ဆောင်မဟုသည် အရန်ဒေတာကို လက်ခံရရဟိပဌီသ ထိုနည်သအတိုင်သ စီမံခန့်ခလဲသည်။

သင့်အာရုံစိုက်မဟုအတလက် ကျေသဇူသတင်ပါသည်၊ သင့်မဟတ်ချက်မျာသနဟင့် တောင်သဆိုချက်မျာသကို ဆလဲထုတ်ရန် ကျလန်ုပ်တို့ မျဟော်လင့်ပါသည်။

source: www.habr.com

မဟတ်ချက် Add