ViennaNET: statuto bibliothecae backend. Pars II

In Raiffeisenbank .NET elit communitatis ViennaNET contenta breviter recensere pergit. Quomodo et quare ad hoc venimus? potes legere primam partem.

In hoc articulo, per bibliothecas adhuc considerandas ibimus ad negotia distributa, queues et databases operandi, quae reperiri possunt in repositorio nostro GitHub (fontes hic sunt), Autem Nuget hic packages.

ViennaNET: statuto bibliothecae backend. Pars II

ViennaNET.Sagas

Cum machinae ad DDD et microserviae architecturae permutationes spectant, tum cum logica negotia per diversa officia distributa sunt, quaestio oritur ad necessitatem adhibendae mechanismi transactionis distributae, quod multi missiones saepe plures regiones simul afficiunt. Has machinationes diligentius cognoscere potes, v.gr. in libro "Microservices Patterns", Chris Richardson.

In inceptis nostris simplicem sed utilem mechanismum implevimus: saga, vel potius saga orchestration substructio. Essentia eius talis est: est quoddam negotium missionis in quo oportet operationes consequenter exercere in diversis officiis, et si aliquae difficultates oriuntur quovis gradu, necesse est dicere regressionem procedendi ad omnes gradus superiores, ubi est. provideatur. Ita, in fine sagae, pro victoria, datas constantes in omnibus ditionibus accipimus.

Exsecutio nostra adhuc in sua forma fundamentali efficitur nec ligatur usibus quarumlibet modorum commercii cum aliis officiis. Uti non difficile est: genus basis abstractae SagaBase<T> oriundum fac, ubi T genus contextus tui est in quo remittere potes notitias initiales necessarias pro saga ad operandum, et ad aliquos eventus intermedios. Instantia contextus per omnes gradus in executione transibit. Saga ipsa classis est state state, ideo instantia potest in DI poni sicut Singleton ad necessarias clientelas acquirendas.

Exemplum ad:

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

Exemplum vocationis:

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

Exempla plena variarum exsecutionum spectari possunt hic et in contione probat.

ViennaNET.Orm.

Bibliothecarum institutum ad operandum variis databases per Nhibernatum. DB-Primo accessu Liquibasi utendo utimur, ergo sola est functionalitas ad operandum cum notitia in datorum prompto factarum.

ViennaNET.Orm.Seedwork и ViennaNET.Orm — conventus principales continentes interfaces fundamentales et eorum exsecutiones respective. Inspiciamus earum contenta planius.

interface IEntityFactoryService atque exsecutionem EntityFactoryService principale principium est ad operandum cum datorum datorum, quoniam Unitas Operis, repositoria ad operandum cum entibus specificis, necnon executores mandatorum et inquisitiones directae SQL hic creantur. Aliquando convenit limitare facultates generis ad operandum cum datorum, verbi gratia, facultatem ad solum datas legere. Pro talibus IEntityFactoryService est antecessoris - interface IEntityRepositoryFactoryquae sola repositoria creandi modum declarat.

Ut directe accessum datorum, provisor mechanismus adhibetur. Singulis DBMS in nostris iunctionibus utimur suam exsecutionem; ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Simul plures provisores in una applicatione simul adnotari possunt, quae concedit, exempli gratia, intra unius servitii compagem, sine ullis sumptibus infrastructuram modificationis, gradatim migrationis exsequi. unus DBMS alteri. Mechanismus ad nexum requisitum eligendum et proinde provisor pro entitate certae classis (pro qua tabularum tabularum datorum scripta est) perficiatur per perscriptum entitatis in genere BoundedContext (modum continet entium domain perscriptum) vel successorem eius. Applicationem Context (modos continet applicationis entia perscriptum, postulata directa et mandata), ubi nexus identifier ex configuratione accipitur pro argumento:

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

Exemplum ApplicationContext:

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

Si connexio ID non specificata est, nexus qui "per annum" nominatus est adhibebitur.

Directa tabularum entium ad tabulas datorum applicandas est utens instrumentorum normarum nHibernatarum. Descriptione uti potes tum per xml limas tum per classes. Ad scripturam convenientem repositoria stipularum in Unit probatis, bibliotheca est ViennaNET.TestUtils.Orm.

Plena exempla utendi ViennaNET.Orm.* inveniri possunt hic.

ViennaNET.Messaging.

Libraria operandi cum queues.

Ad operandum cum queues, eadem accessio est electa ac cum variis DBMSs, scilicet, maximam accessionem unitam fieri secundum operandi cum bibliotheca, cuiuscumque procurator usus est. Bibliotheca ViennaNET.Messaging prorsus est responsabilis huius adunationis et ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue Accommodationes aptationes continent IBM MQ, RabbitMQ et Kafka, respective.

Cum stantibus anteponere opus est, duo sunt processus: nuntium accipientes ac mittentes.

Considera acceptionem. 2 Optiones hic sunt: ​​pro auditione continua et pro uno nuntio accipiendo. Ut constanter audias queue, debebis primum processum classis hereditarium describere IMessageProcessorquae responsales erunt nuntii advenientis dispensando. Deinde, "coniungi" debet cum certa queue; IQueueReactorFactory significans queue identifier ex configuratione;

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

Exemplum incipiendi audiendi:

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

Deinde, cum officium incipit et modus auscultandi incipiendi vocatur, omnes nuntii a queue determinato processui respondenti eunt.

Nuntium unum accipere officinas interface IMessagingComponentFactory est modus CreateMessageReceiverquae recipiens creabit exspectans nuntium a queue sibi datum;

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

Nuntium mittere vos postulo ut ipse IMessagingComponentFactory et mittentem creare nuntium:

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

Tres optiones paratae factae ad nuntium deserendum ac serialisandum: sicut textus, XML et JSON, sed si opus est, exsequendi interfacies tuam facile potes. IMessageSerializer и IMessageDeserializer.

Facultates singulares uniuscuiusque procuratoris queue conservare conati sumus, exempli causa. ViennaNET.Messaging.MQSeriesQueue sino vos non solum textum mittere, sed etiam nuntios byte ac ViennaNET.Messaging.RabbitMQQueue sustinet, fugat, and on-the-fly queuing. Adaptor noster adaptor pro RabbitMQ etiam speciem aliquam RPC instrumenti facit: nuntium mittimus et responsionem exspectamus ex speciali queue temporaria, quod solum ad unum nuntium responsionis creatum est.

hic per exemplum utendi stantibus anteponere cum basic nexu nuances.

ViennaNET.CallContext

Queues non solum ad integrationem inter varias systemata utimur, sed etiam ad communicationem inter eadem applicationis microservices, exempli gratia, intra saga. Inde ad necessitatem transmittendi una cum nuntiis tam auxiliaribus quam usoris login, petentibus identifier ad finem-ad-finem logging, fons IP oratio et auctoritas data. Ad hanc datam transmissionem efficiendam, bibliothecam elaboravimus ViennaNET.CallContext, quod tibi concedit copiam datam ab ineundo servitio petendi. In hoc casu, quomodo petitum sit per queue vel per Http, non refert. Deinde, antequam petitionem vel nuntium ad exitum mittat, notitia ex contextu sumpta et in capite deprehensa est. Ita proximum ministerium notitias auxiliares accipit et eodem modo administrat.

Gratias tibi pro attentione tua, tuas commentarios expectamus et petitiones collige!

Source: www.habr.com

Add a comment