ViennaNET: usa ka hugpong sa mga librarya alang sa backend. Bahin 2

Ang Raiffeisenbank .NET developer nga komunidad nagpadayon sa mubo nga pagrepaso sa mga sulod sa ViennaNET. Mahitungod sa unsa ug ngano nga kita miabut niini, mabasa nimo ang unang bahin.

Niini nga artikulo, moagi kami sa mga librarya nga wala pa gikonsiderar alang sa pagtrabaho sa gipang-apod-apod nga mga transaksyon, pila ug mga database, nga makita sa among GitHub repository (mga tinubdan dinhi), ug Nuget packages dinhi.

ViennaNET: usa ka hugpong sa mga librarya alang sa backend. Bahin 2

ViennaNET.Sagas

Kung ang usa ka proyekto mobalhin sa DDD ug microservice nga arkitektura, unya kung ang lohika sa negosyo giapod-apod sa lainlaing mga serbisyo, usa ka problema ang motungha nga may kalabutan sa panginahanglan nga ipatuman ang usa ka mekanismo sa pag-apod-apod sa transaksyon, tungod kay daghang mga senaryo ang kanunay nga makaapekto sa daghang mga domain sa usa ka higayon. Mahimo nimong pamilyar ang ingon nga mga mekanismo sa mas detalyado, pananglitan, sa libro nga "Microservices Patterns", Chris Richardson.

Sa among mga proyekto, among gipatuman ang usa ka yano apan mapuslanon nga mekanismo: usa ka saga, o hinoon usa ka saga nga nakabase sa orkestrasyon. Ang esensya niini mao ang mga musunud: adunay usa ka piho nga senaryo sa negosyo diin kinahanglan nga sunud-sunod nga himuon ang mga operasyon sa lainlaing mga serbisyo, ug kung adunay bisan unsang mga problema nga motumaw sa bisan unsang lakang, kinahanglan nga tawagan ang pamaagi sa pag-rollback alang sa tanan nga nangaging mga lakang, kung diin kini. gihatag. Sa ingon, sa katapusan sa saga, bisan unsa pa ang kalampusan, makadawat kami makanunayon nga datos sa tanan nga mga dominyo.

Ang among pagpatuman gihimo gihapon sa batakang porma niini ug wala gihigot sa paggamit sa bisan unsang pamaagi sa pakig-uban sa ubang mga serbisyo. Dili kini lisud gamiton: paghimo lang usa ka kaliwat sa base abstract class SagaBase<T>, diin ang T mao ang imong konteksto nga klase diin mahimo nimong tipigan ang inisyal nga datos nga gikinahanglan aron magtrabaho ang saga, ingon man ang pipila ka intermediate nga mga resulta. Ang konteksto nga pananglitan ipasa sa tanan nga mga lakang sa panahon sa pagpatuman. Ang Saga mismo usa ka stateless nga klase, mao nga ang instance mahimong ibutang sa DI isip Singleton aron makuha ang gikinahanglan nga dependencies.

Pananglitan nga ad:

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

Pananglitan nga tawag:

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

Ang bug-os nga mga pananglitan sa lain-laing mga pagpatuman mahimong tan-awon dinhi ug sa asembliya uban sa mga pagsulay.

ViennaNET.Orm.*

Usa ka hugpong sa mga librarya alang sa pagtrabaho sa lainlaing mga database pinaagi sa Nhibernate. Gigamit namon ang DB-First nga pamaagi gamit ang Liquibase, mao nga adunay gamit lamang alang sa pagtrabaho sa datos sa usa ka andam nga database.

ViennaNET.Orm.Seedwork ΠΈ ViennaNET.Orm - nag-unang mga asembliya nga adunay sukaranan nga mga interface ug ang ilang mga pagpatuman, matag usa. Atong tan-awon ang ilang mga sulod sa mas detalyado.

interface IEntityFactoryService ug pagpatuman niini EntityFactoryService mao ang nag-unang punto sa pagsugod sa pagtrabaho kauban ang database, tungod kay ang Unit of Work, mga repository alang sa pagtrabaho kauban ang mga piho nga entidad, ingon man ang mga tigpatuman sa mga mando ug direkta nga mga pangutana sa SQL gihimo dinhi. Usahay kombenyente nga limitahan ang mga kapabilidad sa usa ka klase alang sa pagtrabaho sa usa ka database, pananglitan, aron mahatagan ang katakus sa pagbasa lamang sa datos. Alang sa ingon nga mga kaso IEntityFactoryService adunay usa ka katigulangan - interface IEntityRepositoryFactory, nga nagpahayag lamang og usa ka pamaagi sa paghimo og mga repository.

Aron direktang ma-access ang database, gigamit ang mekanismo sa provider. Ang matag DBMS nga among gigamit sa among mga team adunay kaugalingong pagpatuman: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Sa parehas nga oras, daghang mga provider ang mahimong marehistro sa usa ka aplikasyon sa parehas nga oras, nga nagtugot, pananglitan, sa sulud sa usa ka serbisyo, nga wala’y gasto alang sa pagbag-o sa imprastraktura, aron mahimo ang usa ka lakang sa lakang nga paglalin gikan sa usa ka DBMS ngadto sa lain. Ang mekanismo sa pagpili sa gikinahanglan nga koneksyon ug, busa, ang tighatag alang sa usa ka piho nga klase sa entidad (diin ang pagmapa sa mga lamesa sa database gisulat) gipatuman pinaagi sa pagrehistro sa entidad sa BoundedContext nga klase (naglangkob usa ka pamaagi sa pagrehistro sa mga entidad sa domain) o ang manununod niini. ApplicationContext (naglangkob sa mga pamaagi sa pagrehistro sa mga entidad sa aplikasyon, direkta nga mga hangyo ug mga sugo), diin ang koneksyon identifier gikan sa configuration gidawat isip argumento:

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

Pananglitan sa Konteksto sa Aplikasyon:

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

Kung ang koneksyon ID wala gitino, nan ang koneksyon nga ginganlag "default" ang gamiton.

Ang direktang pagmapa sa mga entidad ngadto sa mga lamesa sa database gipatuman gamit ang standard nga mga himan sa NHibernate. Mahimo nimong gamiton ang paghulagway pinaagi sa xml nga mga file ug pinaagi sa mga klase. Para sa sayon ​​nga pagsulat sa mga stub repository sa Unit tests, adunay library ViennaNET.TestUtils.Orm.

Ang tibuok nga mga pananglitan sa paggamit sa ViennaNET.Orm.* makita dinhi.

ViennaNET.Messaging.*

Usa ka hugpong sa mga librarya alang sa pagtrabaho sa mga pila.

Aron magtrabaho sa mga pila, ang parehas nga pamaagi gipili sama sa lainlaing mga DBMS, nga mao, ang labing kadaghan nga posible nga hiniusa nga pamaagi sa mga termino sa pagtrabaho kauban ang librarya, bisan unsa pa ang gigamit nga manager sa pila. Library ViennaNET.Messaging mao ang tukma nga responsable alang niini nga panaghiusa, ug ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue ΠΈ ViennaNET.Messaging.KafkaQueue naglangkob sa mga pagpatuman sa adapter alang sa IBM MQ, RabbitMQ ug Kafka, matag usa.

Kung nagtrabaho uban ang mga pila, adunay duha ka proseso: pagdawat ug mensahe ug pagpadala niini.

Ikonsiderar ang pagdawat. Adunay 2 nga mga kapilian dinhi: alang sa padayon nga pagpaminaw ug alang sa pagdawat sa usa ka mensahe. Aron kanunay nga maminaw sa pila, kinahanglan nimo nga ihulagway una ang klase sa processor nga napanunod IMessageProcessor, nga maoy responsable sa pagproseso sa umaabot nga mensahe. Sunod, kini kinahanglan nga "nalambigit" sa usa ka piho nga pila; kini gihimo pinaagi sa pagrehistro sa IQueueReactorFactory nga nagpakita sa queue identifier gikan sa configuration:

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

Pananglitan sa pagsugod sa pagpaminaw:

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

Unya, sa diha nga ang serbisyo magsugod ug ang pamaagi gitawag sa pagsugod sa pagpaminaw, ang tanan nga mga mensahe gikan sa espesipikong pila moadto sa katugbang nga processor.

Aron makadawat usa ka mensahe sa interface sa pabrika IMessagingComponentFactory naay pamaagi CreateMessageReceivernga maghimo usa ka tigdawat nga naghulat alang sa usa ka mensahe gikan sa pila nga gipiho niini:

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

Para magpadala ug mensahe kinahanglan nimo gamiton ang parehas IMessagingComponentFactory ug paghimo usa ka nagpadala sa mensahe:

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

Adunay tulo ka andam nga mga kapilian alang sa pag-serialize ug pag-deserialize sa usa ka mensahe: text lang, XML ug JSON, apan kung gikinahanglan, dali ka makahimo sa imong kaugalingon nga mga pagpatuman sa interface. IMessageSerializer ΠΈ IMessageDeserializer.

Kami misulay sa pagpreserbar sa talagsaon nga kapabilidad sa matag queue manager, e.g. ViennaNET.Messaging.MQSeriesQueue nagtugot kanimo sa pagpadala dili lamang sa teksto, apan usab sa mga mensahe sa byte, ug ViennaNET.Messaging.RabbitMQQueue nagsuporta sa routing ug on-the-fly queuing. Ang among adapter wrapper alang sa RabbitMQ nagpatuman usab sa pipila ka kaamgid sa RPC: nagpadala kami og mensahe ug maghulat sa tubag gikan sa usa ka espesyal nga temporaryo nga pila, nga gimugna alang lamang sa usa ka tubag nga mensahe.

dinhi usa ka pananglitan sa paggamit sa mga pila nga adunay sukaranan nga mga nuances sa koneksyon.

ViennaNET.CallContext

Gigamit namon ang mga pila dili lamang alang sa panagsama tali sa lainlaing mga sistema, apan alang usab sa komunikasyon tali sa mga microservice sa parehas nga aplikasyon, pananglitan, sulod sa usa ka saga. Kini misangpot sa panginahanglan sa pagpadala uban sa mensahe sama sa auxiliary data sama sa user login, paghangyo identifier alang sa end-to-end logging, tinubdan IP address ug pagtugot data. Aron mapatuman ang pagpasa niini nga datos, naghimo kami og librarya ViennaNET.CallContext, nga nagtugot kanimo sa pagtipig sa datos gikan sa usa ka hangyo nga mosulod sa serbisyo. Sa kini nga kaso, kung giunsa gihimo ang hangyo, pinaagi sa usa ka pila o pinaagi sa Http, dili igsapayan. Dayon, sa dili pa ipadala ang mogawas nga hangyo o mensahe, ang datos gikuha gikan sa konteksto ug gibutang sa mga ulohan. Busa, ang sunod nga serbisyo makadawat sa auxiliary data ug pagdumala niini sa samang paagi.

Salamat sa imong pagtagad, nagpaabut kami sa imong mga komento ug mga hangyo sa pagbitad!

Source: www.habr.com

Idugang sa usa ka comment