ViennaNET: txheej tsev qiv ntawv rau lub backend. Ntu 2

Raiffeisenbank .NET cov neeg tsim tawm hauv zej zog txuas ntxiv mus saib luv luv cov ntsiab lus ntawm ViennaNET. Hais txog yuav ua li cas thiab vim li cas peb tuaj rau qhov no, koj tuaj yeem nyeem thawj ntu.

Hauv tsab xov xwm no, peb yuav mus dhau ntawm cov tsev qiv ntawv tseem tsis tau txiav txim siab rau kev ua haujlwm nrog kev faib khoom lag luam, kab thiab databases, uas tuaj yeem pom hauv peb qhov chaw cia GitHub (qhov chaw nyob ntawm no), thiab Nuget pob ntawm no.

ViennaNET: txheej tsev qiv ntawv rau lub backend. Ntu 2

ViennaNET.Sagas

Thaum ib qhov project hloov mus rau DDD thiab microservice architecture, ces thaum kev lag luam logic raug faib thoob plaws cov kev pabcuam sib txawv, muaj teeb meem tshwm sim txog qhov xav tau los siv cov txheej txheem kev faib tawm, vim tias ntau qhov xwm txheej feem ntau cuam tshuam rau ntau qhov chaw ib zaug. Koj tuaj yeem paub txog cov txheej txheem zoo li no hauv kev nthuav dav ntxiv, piv txwv li, nyob rau hauv phau ntawv "Microservices Patterns", Chris Richardson.

Hauv peb cov haujlwm, peb tau siv cov txheej txheem yooj yim tab sis muaj txiaj ntsig zoo: dab neeg dab neeg, lossis ib qho kev ua yeeb yam raws li dab neeg. Nws cov ntsiab lus yog raws li hauv qab no: muaj qee yam kev lag luam scenario uas yuav tsum tau ua raws li kev ua haujlwm hauv cov kev pabcuam sib txawv, thiab yog tias muaj teeb meem tshwm sim ntawm txhua kauj ruam, nws yuav tsum tau hu rau cov txheej txheem rollback rau tag nrho cov kauj ruam dhau los, qhov twg nws yog. muab. Yog li, thaum kawg ntawm dabneeg, tsis hais txog kev vam meej, peb tau txais cov ntaub ntawv zoo ib yam hauv txhua qhov.

Peb qhov kev siv yog tseem ua nyob rau hauv nws daim ntawv yooj yim thiab tsis khi rau kev siv ib txoj kev ntawm kev sib cuam tshuam nrog rau lwm yam kev pab cuam. Nws tsis yooj yim rau siv: tsuas yog ua ib tug xeeb leej xeeb ntxwv ntawm lub hauv paus paub daws teeb chav kawm SagaBase<T>, qhov twg T yog koj cov ntsiab lus hauv chav kawm uas koj tuaj yeem khaws cov ntaub ntawv thawj zaug tsim nyog rau cov dabneeg ua haujlwm, nrog rau qee qhov txiaj ntsig nruab nrab. Cov ntsiab lus piv txwv yuav dhau mus rau txhua kauj ruam thaum ua tiav. Saga nws tus kheej yog ib chav kawm tsis muaj neeg nyob, yog li qhov piv txwv tuaj yeem muab tso rau hauv DI raws li Singleton kom tau txais qhov tsim nyog nyob.

Piv txwv ad:

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

Piv txwv hu:

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

Tag nrho cov piv txwv ntawm kev siv sib txawv tuaj yeem pom no thiab sib dhos nrog kuaj.

ViennaNET.Orm.*

Ib txheej tsev qiv ntawv rau kev ua haujlwm nrog ntau yam databases ntawm Nhibernate. Peb siv DB-First mus kom ze siv Liquibase, yog li tsuas muaj kev ua haujlwm rau kev ua haujlwm nrog cov ntaub ntawv hauv cov ntaub ntawv npaj txhij.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - Cov rooj sib txoos loj uas muaj cov interfaces yooj yim thiab lawv cov kev siv, feem. Cia peb saib lawv cov ntsiab lus hauv kev nthuav dav ntxiv.

interface IEntityFactoryService thiab nws qhov kev siv EntityFactoryService yog lub ntsiab lus pib ntawm kev ua haujlwm nrog cov ntaub ntawv, txij li Lub Tsev Haujlwm Saib Xyuas Haujlwm, cov chaw khaws cia rau kev ua haujlwm nrog cov koom haum tshwj xeeb, nrog rau cov thawj coj ntawm cov lus txib thiab cov lus nug ncaj qha SQL tau tsim ntawm no. Qee lub sij hawm nws yooj yim los txwv cov peev txheej ntawm chav kawm rau kev ua haujlwm nrog cov ntaub ntawv, piv txwv li, muab lub peev xwm los nyeem cov ntaub ntawv nkaus xwb. Rau cov xwm txheej zoo li no IEntityFactoryService muaj ib tug yawm txiv - interface IEntityRepositoryFactory, uas tsuas yog tshaj tawm ib txoj hauv kev los tsim cov chaw cia khoom.

Txhawm rau nkag mus ncaj qha rau cov ntaub ntawv, cov txheej txheem muab kev pabcuam raug siv. Txhua DBMS peb siv hauv peb pab pawg muaj nws tus kheej siv: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Nyob rau tib lub sijhawm, ntau tus neeg muab kev pabcuam tuaj yeem sau npe rau hauv ib daim ntawv thov tib lub sijhawm, uas tso cai rau, piv txwv li, nyob rau hauv lub moj khaum ntawm ib qho kev pabcuam, tsis muaj nqi rau kev hloov kho cov txheej txheem, ua ib kauj ruam los ntawm kev tsiv teb tsaws chaw. ib DBMS rau lwm tus. Cov txheej txheem rau kev xaiv qhov kev sib txuas uas yuav tsum tau ua thiab, yog li ntawd, tus neeg muab kev pabcuam rau cov chav kawm tshwj xeeb (rau qhov kev kos npe rau cov rooj sib tham yog sau) yog siv los ntawm kev sau npe rau lub koom haum hauv BoundedContext chav kawm (muaj ib txoj hauv kev rau npe cov chaw sau npe) lossis nws cov neeg ua tiav. ApplicationContext (muaj cov txheej txheem rau kev tso npe thov cov koom haum, kev thov ncaj qha thiab cov lus txib), qhov twg tus cim kev sib txuas los ntawm kev teeb tsa raug lees txais raws li kev sib cav:

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

Piv txwv ApplicationContext:

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

Yog tias qhov kev sib txuas ID tsis tau teev tseg, ces qhov kev sib txuas hu ua "default" yuav raug siv.

Kev taw qhia ncaj qha ntawm cov chaw rau cov ntxhuav database yog siv los ntawm cov cuab yeej NHibernate. Koj tuaj yeem siv cov lus piav qhia ob qho tib si los ntawm cov ntaub ntawv xml thiab hauv chav kawm. Rau kev sau ntawv yooj yim ntawm cov ntaub ntawv khaws cia hauv Chav ntsuas, muaj lub tsev qiv ntawv ViennaNET.TestUtils.Orm.

Tag nrho cov piv txwv ntawm kev siv ViennaNET.Orm.* tuaj yeem pom no.

ViennaNET.Messaging.*

Ib txheej tsev qiv ntawv rau kev ua haujlwm nrog cov kab.

Txhawm rau ua haujlwm nrog cov kab, tib txoj hauv kev tau xaiv raws li nrog ntau yam DBMSs, uas yog, qhov siab tshaj plaws tuaj yeem koom ua ke hauv cov ntsiab lus ntawm kev ua haujlwm nrog lub tsev qiv ntawv, tsis hais tus neeg saib xyuas kab siv. Lub tsev qiv ntawv ViennaNET.Messaging yog precisely lub luag hauj lwm rau no unification, thiab ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue muaj cov kev siv adapter rau IBM MQ, RabbitMQ thiab Kafka, feem.

Thaum ua hauj lwm nrog queues, muaj ob txheej txheem: tau txais cov lus thiab xa nws.

Xav txog kev txais. Muaj 2 txoj kev xaiv ntawm no: rau kev mloog tas mus li thiab tau txais ib qho lus. Txhawm rau mloog cov kab lus tas li, koj yuav tsum xub piav qhia txog cov chav kawm processor tau txais los ntawm IMessageProcessor, uas yuav yog lub luag haujlwm rau kev ua cov lus tuaj. Tom ntej no, nws yuav tsum tau "txuas" mus rau ib qho kab tshwj xeeb; qhov no yog ua tiav los ntawm kev sau npe hauv IQueueReactorFactory qhia qhov queue identifier los ntawm configuration:

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

Piv txwv ntawm kev pib mloog:

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

Tom qab ntawd, thaum qhov kev pab cuam pib thiab txoj kev raug hu kom pib mloog, tag nrho cov lus los ntawm cov kab ntawv teev tseg yuav mus rau qhov sib thooj processor.

Kom tau txais ib cov lus nyob rau hauv lub Hoobkas interface IMessagingComponentFactory muaj ib txoj kev CreateMessageReceiveruas yuav tsim ib tus neeg txais tos rau cov lus los ntawm cov kab teev tseg rau nws:

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

Xa lus koj yuav tsum siv tib yam IMessagingComponentFactory thiab tsim tus xa xov:

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

Muaj peb txoj kev npaj ua tiav rau serializing thiab deserializing cov lus: tsuas yog ntawv nyeem, XML thiab JSON, tab sis yog tias tsim nyog, koj tuaj yeem yooj yim ua koj tus kheej interface siv IMessageSerializer и IMessageDeserializer.

Peb tau sim khaws cov peev txheej tshwj xeeb ntawm txhua tus neeg saib xyuas kab, xws li. ViennaNET.Messaging.MQSeriesQueue tso cai rau koj xa tsis tau ntawv xwb, tab sis kuj byte lus, thiab ViennaNET.Messaging.RabbitMQQueue txhawb routing thiab on-the-fly queuing. Peb lub wrapper adapter rau RabbitMQ kuj siv qee qhov zoo ib yam ntawm RPC: peb xa lus thiab tos cov lus teb los ntawm cov kab tshwj xeeb ib ntus, uas yog tsim los rau ib qho lus teb xwb.

no ib qho piv txwv ntawm kev siv cov kab nrog kev sib txuas yooj yim nuances.

ViennaNET.CallContext

Peb siv cov kab ke tsis yog rau kev sib koom ua ke ntawm cov tshuab sib txawv, tab sis kuj rau kev sib txuas lus ntawm microservices ntawm tib daim ntawv thov, piv txwv li, hauv dab neeg. Qhov no ua rau qhov yuav tsum tau xa nrog rau cov lus xws li cov ntaub ntawv pabcuam raws li tus neeg siv nkag mus, thov tus lej cim rau qhov kawg-rau-kawg txiav, qhov chaw nyob IP thiab cov ntaub ntawv tso cai. Txhawm rau ua qhov kev xa tawm ntawm cov ntaub ntawv no, peb tsim lub tsev qiv ntawv ViennaNET.CallContext, uas tso cai rau koj khaws cov ntaub ntawv los ntawm kev thov nkag mus rau qhov kev pabcuam. Nyob rau hauv rooj plaub no, yuav ua li cas thov, los ntawm ib tug queue los yog ntawm Http, tsis muaj teeb meem. Tom qab ntawd, ua ntej xa cov lus thov lossis cov lus xa tawm, cov ntaub ntawv raug muab los ntawm cov ntsiab lus thiab muab tso rau hauv cov headers. Yog li, qhov kev pabcuam tom ntej no tau txais cov ntaub ntawv pabcuam thiab tswj nws tib yam nkaus.

Ua tsaug rau koj qhov kev mloog, peb tos ntsoov rau koj cov lus thiab rub cov lus thov!

Tau qhov twg los: www.hab.com

Ntxiv ib saib