ViennaNET: gulu la malaibulale a backend. Gawo 2

Gulu la otukula la Raiffeisenbank .NET akupitiliza kuwunika mwachidule zomwe zili mu ViennaNET. Za momwe komanso chifukwa chake tidafikira izi, mukhoza kuwerenga gawo loyamba.

M'nkhaniyi, tidutsa m'malaibulale omwe akuyenera kuganiziridwabe kuti tigwire ntchito ndi magawo, mizere ndi nkhokwe, zomwe zingapezeke m'malo athu a GitHub (magwero ali pano), ndipo Phukusi la Nuget apa.

ViennaNET: gulu la malaibulale a backend. Gawo 2

ViennaNET.Sagas

Ntchito ikasinthira ku DDD ndi zomangamanga za microservice, ndiye kuti malingaliro abizinesi akagawidwa m'mautumiki osiyanasiyana, vuto limakhala lokhudzana ndi kufunikira kogwiritsa ntchito njira yogawa, chifukwa zochitika zambiri zimakhudza madera angapo nthawi imodzi. Mutha kudziwana ndi njira zotere mwatsatanetsatane, mwachitsanzo, m'buku la "Microservices Patterns", Chris Richardson.

M'mapulojekiti athu, takhazikitsa njira yosavuta koma yothandiza: saga, kapena nyimbo yoyimba nyimbo. Zofunikira zake ndi izi: pali zochitika zina zamalonda zomwe zimayenera kuchitidwa motsatizana ndi ntchito zosiyanasiyana, ndipo ngati pali vuto lililonse pa sitepe iliyonse, m'pofunika kuyitanira ndondomeko yobwezera kumbuyo kwa masitepe onse apitalo, kumene kuli koyenera. kupereka. Chifukwa chake, kumapeto kwa saga, mosasamala kanthu za kupambana, timalandira deta yokhazikika m'madera onse.

Kukhazikitsa kwathu kumapangidwabe mwanjira yake yoyambira ndipo sikumangiriridwa ndi kugwiritsa ntchito njira zilizonse zolumikizirana ndi mautumiki ena. Sizovuta kugwiritsa ntchito: ingopanga mbadwa ya SagaBase yoyambira <T>, pomwe T ndi kalasi yanu yomwe mungasungire zoyambira zofunika kuti saga igwire ntchito, komanso zotsatira zina zapakatikati. Chitsanzo chotsatirachi chidzaperekedwa ku masitepe onse panthawi ya kuphedwa. Saga palokha ndi gulu lopanda malire, kotero chitsanzocho chikhoza kuikidwa mu DI ngati Singleton kuti mupeze zodalira zofunika.

Chitsanzo malonda:

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

Kuitana kwachitsanzo:

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

Zitsanzo zonse za zochitika zosiyanasiyana zikhoza kuwonedwa apa ndi mu msonkhano ndi mayeso.

ViennaNET.Orm.*

Gulu la malaibulale ogwirira ntchito ndi nkhokwe zosiyanasiyana kudzera ku Nhibernate. Timagwiritsa ntchito njira ya DB-First pogwiritsa ntchito Liquibase, kotero pali ntchito yokha yogwira ntchito ndi deta mu database yokonzekera.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - misonkhano ikuluikulu yokhala ndi zolumikizira zoyambira ndi magwiritsidwe ake, motsatana. Tiyeni tione zomwe zili mkati mwawo mwatsatanetsatane.

mawonekedwe IEntityFactoryService ndi kukhazikitsa kwake EntityFactoryService ndiye poyambira poyambira kugwira ntchito ndi nkhokwe, popeza Unit of Work, nkhokwe zogwirira ntchito ndi mabungwe enaake, komanso opereka malamulo ndi mafunso achindunji a SQL amapangidwa pano. Nthawi zina ndi bwino kuchepetsa mphamvu za kalasi yogwira ntchito ndi database, mwachitsanzo, kupereka luso lowerenga deta. Kwa milandu yotere IEntityFactoryService pali mawonekedwe a makolo IEntityRepositoryFactory, yomwe imangolengeza njira yopangira nkhokwe.

Kuti mupeze mwachindunji database, njira yoperekera chithandizo imagwiritsidwa ntchito. DBMS iliyonse yomwe timagwiritsa ntchito m'magulu athu ili ndi kukhazikitsa kwake: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Nthawi yomweyo, opereka angapo amatha kulembetsedwa mu pulogalamu imodzi nthawi imodzi, zomwe zimalola, mwachitsanzo, mkati mwa ntchito imodzi, popanda mtengo uliwonse wosinthira zomangamanga, kuti achite kusamuka kwapang'onopang'ono kuchokera. DBMS imodzi kupita ku imzake. Njira yosankhira kulumikizana kofunikira ndipo, chifukwa chake, wopereka gulu linalake (lomwe mapu amalembedwera pamatebulo a database) amakhazikitsidwa polembetsa bungwe mugulu la BoundedContext (lili ndi njira yolembetsera mabungwe) kapena wolowa m'malo mwake. ApplicationContext (ili ndi njira zolembetsera mabungwe ofunsira, zopempha mwachindunji ndi malamulo), pomwe chizindikiritso cholumikizira kuchokera pakusintha chimavomerezedwa ngati mkangano:

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

Chitsanzo ApplicationContext:

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

Ngati ID yolumikizira sinatchulidwe, ndiye kuti kulumikizana komwe kumatchedwa "default" kudzagwiritsidwa ntchito.

Kujambula kwachindunji kwa mabungwe kumatebulo a database kumakhazikitsidwa pogwiritsa ntchito zida zokhazikika za NHibernate. Mutha kugwiritsa ntchito mafotokozedwe onse kudzera pamafayilo a xml komanso m'makalasi. Pakulemba kosavuta kwa nkhokwe za stub pamayeso a Unit, pali laibulale ViennaNET.TestUtils.Orm.

Zitsanzo zonse zogwiritsira ntchito ViennaNET.Orm.* zitha kupezeka apa.

ViennaNET.Messaging.*

Gulu la malaibulale ogwirira ntchito ndi mizere.

Kuti mugwire ntchito ndi mizere, njira yomweyi idasankhidwa ngati ma DBMS osiyanasiyana, mwachitsanzo, njira yolumikizirana kwambiri pogwira ntchito ndi laibulale, mosasamala kanthu za woyang'anira pamzere wogwiritsidwa ntchito. Library ViennaNET.Messaging ali ndi udindo wogwirizanitsa izi, ndi ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue zili ndi ma adapter a IBM MQ, RabbitMQ ndi Kafka, motsatana.

Pogwira ntchito ndi mizere, pali njira ziwiri: kulandira uthenga ndi kutumiza.

Lingalirani kulandira. Pali njira ziwiri apa: kumvetsera mosalekeza komanso kulandira uthenga umodzi. Kuti mumvetsere pamzere nthawi zonse, muyenera kufotokoza kaye gulu la purosesa lomwe mwatengera IMessageProcessor, yomwe idzakhala ndi udindo wokonza uthenga womwe ukubwera. Kenako, iyenera "kulumikizidwa" ndi mzere wina; izi zimachitika kudzera mu kulembetsa IQueueReactorFactory kusonyeza chizindikiritso cha pamzere kuchokera pa kasinthidwe:

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

Chitsanzo choyamba kumvetsera:

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

Kenako, utumiki ukayamba ndipo njirayo ikuyitanidwa kuti iyambe kumvetsera, mauthenga onse ochokera pamzere wotchulidwa adzapita ku purosesa yogwirizana.

Kulandira uthenga umodzi mu mawonekedwe fakitale IMessagingComponentFactory pali njira CreateMessageReceiverzomwe zipanga wolandira kudikirira uthenga kuchokera pamzere womwe wafotokozedwa kwa iwo:

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

Kutumiza meseji muyenera kugwiritsa ntchito zomwezo IMessagingComponentFactory ndi kupanga wotumiza uthenga:

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

Pali njira zitatu zomwe zakonzedwa kuti zisungidwe ndikuchotsa uthenga: zolemba, XML ndi JSON, koma ngati kuli kofunikira, mutha kupanga mawonekedwe anu mosavuta. IMessageSerializer и IMessageDeserializer.

Tayesera kusunga luso lapadera la woyang'anira pamzere aliyense, mwachitsanzo. ViennaNET.Messaging.MQSeriesQueue amakulolani kutumiza osati zolemba, komanso ma byte mauthenga, ndi ViennaNET.Messaging.RabbitMQQueue imathandizira panjira komanso pamzere wowuluka. Adaputala yathu ya RabbitMQ imagwiritsanso ntchito mawonekedwe a RPC: timatumiza uthenga ndikudikirira kuyankha kuchokera pamzere wapadera wosakhalitsa, womwe umapangidwira uthenga umodzi wokha.

pano chitsanzo chogwiritsa ntchito mizere yokhala ndi ma nuances oyambira olumikizirana.

ViennaNET.CallContext

Sitigwiritsa ntchito mizere pophatikizana pakati pa machitidwe osiyanasiyana, komanso kuyankhulana pakati pa ma microservices a ntchito yomweyo, mwachitsanzo, mkati mwa saga. Izi zidapangitsa kuti pakhale kufunikira kotumiza limodzi ndi uthengawo ngati data yothandiza monga kulowa kwa wogwiritsa ntchito, kupempha chizindikiritso cha kudula mitengo mpaka kumapeto, adilesi ya IP ndi data yovomerezeka. Kuti tigwiritse ntchito kutumiza detayi, tinapanga laibulale ViennaNET.CallContext, zomwe zimakulolani kusunga deta kuchokera ku pempho lolowa muutumiki. Pankhaniyi, momwe pempholi linapangidwira, kudzera pamzere kapena kudzera pa Http, zilibe kanthu. Kenako, musanatumize pempho lotuluka kapena uthenga, deta imatengedwa kuchokera kumutu ndikuyikidwa pamitu. Choncho, utumiki wotsatira umalandira deta yothandiza ndikuyendetsa mofanana.

Zikomo chifukwa cha chidwi chanu, tikuyembekezera ndemanga zanu ndi zopempha zanu!

Source: www.habr.com

Kuwonjezera ndemanga