ViennaNET: fitambarana tranomboky ho an'ny backend. Fizarana 2

Ny vondrom-piarahamonina mpamorona Raiffeisenbank .NET dia manohy mijery fohifohy ny votoatin'ny ViennaNET. Momba ny fomba sy ny antony nahatongavantsika tamin'izany, afaka mamaky ny ampahany voalohany ianao.

Ato amin'ity lahatsoratra ity dia handeha amin'ny tranomboky mbola hodinihina isika mba hiasa amin'ny fifampiraharahana, filaharana ary angon-drakitra, izay hita ao amin'ny tahiry GitHub (loharano eto), ary Nuget fonosana eto.

ViennaNET: fitambarana tranomboky ho an'ny backend. Fizarana 2

ViennaNET.Sagas

Rehefa miova amin'ny DDD sy ny maritrano microservice ny tetikasa iray, dia rehefa zaraina amin'ny serivisy samihafa ny lojikan'ny fandraharahana, dia misy olana mipoitra mifandraika amin'ny filana ny fametrahana rafitra fifampiraharahana mizara, satria matetika ny trangan-javatra maro dia misy fiantraikany amin'ny sehatra maromaro indray mandeha. Azonao atao ny mahafantatra bebe kokoa ny mekanika toy izany, ohatra, ao amin'ny boky "Microservice Patterns", Chris Richardson.

Ao amin'ny tetikasanay dia nampihatra mekanika tsotra nefa mahasoa izahay: tantara iray, na ny marimarina kokoa, tantara mifototra amin'ny orkestra. Ny maha-zava-dehibe azy dia toy izao manaraka izao: misy toe-javatra ara-barotra iray izay ilaina ny manatanteraka ny asa amin'ny serivisy samihafa, ary raha misy olana mitranga amin'ny dingana rehetra, dia ilaina ny miantso ny dingana famerenana amin'ny dingana teo aloha, izay misy azy. omena. Noho izany, amin'ny fiafaran'ny tantara, na inona na inona fahombiazana, dia mahazo angona tsy miovaova amin'ny sehatra rehetra isika.

Ny fampiharana anay dia mbola vita amin'ny endriny fototra ary tsy mifamatotra amin'ny fampiasana fomba fifandraisana amin'ny serivisy hafa. Tsy sarotra ny fampiasana azy: manaova taranaka avy amin'ny kilasy abstract base SagaBase<T>, izay ny T dia kilasy contexte misy anao izay ahafahanao mitahiry ny angona voalohany ilaina amin'ny saga miasa, ary koa ny valiny sasany. Ny ohatra contexte dia halefa amin'ny dingana rehetra mandritra ny famonoana. Saga ny tenany dia kilasy tsy misy fanjakana, ka ny ohatra dia azo apetraka ao amin'ny DI ho Singleton hahazoana ny fiankinan-doha ilaina.

Ohatra doka:

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

Ohatra antso:

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

Azo jerena ny ohatra feno momba ny fampiharana samihafa eto ary amin'ny fivorian'ny FITSAPANA.

ViennaNET.Orm.*

Fitambarana tranomboky miasa miaraka amin'ny angon-drakitra isan-karazany amin'ny alàlan'ny Nhibernate. Mampiasa ny fomba fiasa DB-First izahay amin'ny fampiasana Liquibase, noho izany dia tsy misy afa-tsy ny miasa miaraka amin'ny angon-drakitra ao anaty tahiry efa vonona.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - fivoriambe lehibe misy fifandraisana fototra sy ny fampiharana azy. Andeha hojerentsika amin’ny antsipiriany kokoa ny ao anatiny.

interface tsara IEntityFactoryService sy ny fampiharana azy EntityFactoryService no tena fiaingana amin'ny fiaraha-miasa amin'ny angon-drakitra, satria ny Unit of Work, repository hiasa amin'ny sampana manokana, ary koa ny mpanatanteraka baiko sy ny fangatahana SQL mivantana dia noforonina eto. Indraindray dia mety ny mametra ny fahafahan'ny kilasy iray miasa amin'ny angon-drakitra, ohatra, mba hanomezana fahafahana mamaky angona fotsiny. Ho an'ny tranga toy izany IEntityFactoryService misy razana - interface tsara IEntityRepositoryFactory, izay manambara fomba hamoronana repository fotsiny.

Mba hidirana mivantana amin'ny angon-drakitra dia ampiasaina ny mekanika mpamatsy. Ny DBMS tsirairay ampiasaintsika ao amin'ny ekipantsika dia manana ny fampiharana azy manokana: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Amin'izay fotoana izay ihany koa, misy mpamatsy maromaro azo misoratra anarana amin'ny fampiharana iray amin'ny fotoana iray ihany, izay mamela, ohatra, ao anatin'ny sehatry ny serivisy iray, tsy misy fandaniana amin'ny fanovana ny fotodrafitrasa, hanatanteraka fifindra-monina tsikelikely avy DBMS iray mankany amin'ny iray hafa. Ny mekanika amin'ny fisafidianana ny fifandraisana ilaina ary, noho izany, ny mpamatsy ho an'ny kilasy enti-manokana (izay hanoratana ny sarintany amin'ny latabatra database) dia ampiharina amin'ny alàlan'ny fisoratana anarana ao amin'ny kilasin'ny BoundedContext (misy fomba fisoratana anarana sampan-draharaha) na ny mpandimby azy. ApplicationContext (misy fomba fisoratana anarana enti-misoratra anarana, fangatahana mivantana ary baiko), izay ekena ho tohan-kevitra ny famantarana ny fifandraisana avy amin'ny konfigurasi:

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

Ohatra ApplicationContext:

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

Raha tsy voatondro ny ID fifandraisana dia ny fifandraisana antsoina hoe "default" no hampiasaina.

Ny fametahana sarintany mivantana amin'ny sarintany amin'ny latabatra database dia ampiharina amin'ny alàlan'ny fitaovana NHibernate mahazatra. Azonao atao ny mampiasa ny famaritana na amin'ny alàlan'ny rakitra xml na amin'ny alàlan'ny kilasy. Ho an'ny fanoratana mora amin'ny fitehirizana stub amin'ny fitsapana Unit, misy tranomboky ViennaNET.TestUtils.Orm.

Misy ohatra feno amin'ny fampiasana ViennaNET.Orm.* eto.

ViennaNET.Messaging.*

Fitambarana tranomboky miasa miaraka amin'ny filaharana.

Mba hiasa miaraka amin'ny filaharana, ny fomba fiasa mitovy amin'ny DBMS isan-karazany dia nofidina, izany hoe, ny fomba tokana azo atao indrindra amin'ny resaka fiaraha-miasa amin'ny tranomboky, na inona na inona mpitantana filaharana ampiasaina. -BOKIN'NY Vavolombelon'i Jehovah ViennaNET.Messaging no tompon'andraikitra amin'izany fampiraisana izany, ary ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue misy fampiharana adaptatera ho an'ny IBM MQ, RabbitMQ ary Kafka.

Rehefa miasa miaraka amin'ny filaharana dia misy dingana roa: ny fandraisana hafatra sy ny fandefasana azy.

Diniho ny fandraisana. Misy safidy 2 eto: amin'ny fihainoana tsy tapaka sy amin'ny fandraisana hafatra tokana. Mba hihainoana tsy tapaka ny filaharana, dia tsy maintsy mamaritra aloha ny kilasy processeur nolovaina IMessageProcessor, izay ho tompon'andraikitra amin'ny fanodinana ny hafatra ho avy. Manaraka izany dia tsy maintsy "mifandray" amin'ny filaharana manokana izany dia atao amin'ny fisoratana anarana IQueueReactorFactory manondro ny filaharana famantarana avy amin'ny configuration:

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

Ohatra amin'ny fanombohana fihainoana:

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

Avy eo, rehefa manomboka ny serivisy ary antsoina ny fomba hanombohana ny fihainoana, ny hafatra rehetra avy amin'ny filaharana voatondro dia handeha amin'ny processeur mifanaraka aminy.

Hahazo hafatra tokana amin'ny seha-pihariana iray IMessagingComponentFactory misy fomba CreateMessageReceiverizay hamorona mpandray iray miandry hafatra avy amin'ny filaharana voatondro ho azy:

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

Mba handefasana hafatra mila mampiasa toy izany koa ianao IMessagingComponentFactory ary mamorona mpandefa hafatra:

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

Misy safidy telo efa vonona ho an'ny serializing sy deserializing hafatra: lahatsoratra fotsiny, XML ary JSON, fa raha ilaina, dia afaka manao mora foana ny fampiharana ny interface tsara. IMessageSerializer и IMessageDeserializer.

Niezaka nitahiry ny fahaiza-manaon'ny mpitantana filaharana tsirairay izahay, ohatra. ViennaNET.Messaging.MQSeriesQueue mamela anao handefa tsy lahatsoratra fotsiny, fa koa byte hafatra, ary ViennaNET.Messaging.RabbitMQQueue manohana ny zotra sy ny filaharana amin'ny sidina. Ny fonon'ny adaptatera ho an'ny RabbitMQ koa dia mampihatra ny sasany amin'ny RPC: mandefa hafatra izahay ary miandry valiny avy amin'ny filaharana vonjimaika manokana, izay noforonina ho an'ny hafatra valiny iray ihany.

eto ohatra iray amin'ny fampiasana filaharana miaraka amin'ny nuances fifandraisana fototra.

ViennaNET.CallContext

Mampiasa filaharana izahay tsy ho an'ny fampidirana eo amin'ny rafitra samihafa, fa koa ho an'ny fifandraisana eo amin'ny microservices amin'ny fampiharana mitovy, ohatra, ao anaty saga. Izany dia nitarika ho amin'ny filàna fampitana miaraka amin'ny hafatra toy ny angon-drakitra fanampiny toy ny fidirana amin'ny mpampiasa, fangatahana identifier ho an'ny logging end-to-end, adiresy IP loharano ary angona fahazoan-dàlana. Mba hampiharana ny fandefasana an'io data io dia nanamboatra tranomboky izahay ViennaNET.CallContext, izay ahafahanao mitahiry angona avy amin'ny fangatahana miditra amin'ny serivisy. Amin'ity tranga ity, ny fomba nanaovana ny fangatahana, amin'ny alàlan'ny filaharana na amin'ny alàlan'ny Http, dia tsy maninona. Avy eo, alohan'ny handefasana ny fangatahana na hafatra mivoaka, dia alaina avy amin'ny contexte ny angona ary apetraka ao amin'ny lohapejy. Noho izany, ny serivisy manaraka dia mandray ny angona fanampiny ary mitantana izany amin'ny fomba mitovy.

Misaotra anao noho ny fiheveranao, manantena ny fanehoan-kevitrao sy ny fangatahanao izahay!

Source: www.habr.com

Add a comment