Gebeurtenis brongegevens verzenden patroonEvent Sourcing pattern

Gebruik in plaats van alleen de huidige status van de gegevens worden opgeslagen in een domein, een winkel alleen toevoegen om de volledige reeks van acties die worden uitgevoerd op die gegevens te noteren.Instead of storing just the current state of the data in a domain, use an append-only store to record the full series of actions taken on that data. De store fungeert als het systeem van record en kan worden gebruikt om aan te geven aan de domeinobjecten.The store acts as the system of record and can be used to materialize the domain objects. Dit kan taken in complexe domeinen vereenvoudigen door de noodzaak voor het synchroniseren van het gegevensmodel en het domein voor bedrijven, en verbetert de prestaties, schaalbaarheid en reactiesnelheid voorkomen.This can simplify tasks in complex domains, by avoiding the need to synchronize the data model and the business domain, while improving performance, scalability, and responsiveness. Het kan ook consistentie te bieden voor transactionele gegevens en volledige audittrails en geschiedenis waarmee compensatie acties onderhouden.It can also provide consistency for transactional data, and maintain full audit trails and history that can enable compensating actions.

Context en probleemContext and problem

De meeste toepassingen werken met gegevens en de typische aanpak is voor de toepassing te onderhouden van de huidige status van de gegevens door als gebruikers ermee wordt bijgewerkt.Most applications work with data, and the typical approach is for the application to maintain the current state of the data by updating it as users work with it. Bijvoorbeeld in de traditionele maken, lezen, bijwerken en verwijderen (CRUD) model typische gegevens is om gegevens te lezen uit het archief moet een aantal wijzigingen aan, en de huidige status van de gegevens bijgewerkt met de nieuwe waarden—vaak met behulp van transacties de gegevens die worden vergrendeld.For example, in the traditional create, read, update, and delete (CRUD) model a typical data process is to read data from the store, make some modifications to it, and update the current state of the data with the new values—often by using transactions that lock the data.

De methode CRUD biedt een aantal beperkingen:The CRUD approach has some limitations:

  • CRUD-systemen uitvoeren updatebewerkingen rechtstreeks met een gegevensopslag die u kunnen prestaties en reactiesnelheid vertragen en beperken van schaalbaarheid, vanwege de verwerkingsoverhead van de die is vereist.CRUD systems perform update operations directly against a data store, which can slow down performance and responsiveness, and limit scalability, due to the processing overhead it requires.

  • In een domein samenwerken met veel gelijktijdige gebruikers zijn update gegevensconflicten waarschijnlijker, omdat de updatebewerkingen op één item van gegevens plaatsvinden.In a collaborative domain with many concurrent users, data update conflicts are more likely because the update operations take place on a single item of data.

  • Overzicht van gaat verloren, tenzij er een extra controle mechanisme waarmee de details van elke bewerking in een afzonderlijk logboek vastgelegd.Unless there's an additional auditing mechanism that records the details of each operation in a separate log, history is lost.

Zie voor een beter begrip van de grenzen van de aanpak CRUD CRUD, alleen wanneer u kan bieden It.For a deeper understanding of the limits of the CRUD approach see CRUD, Only When You Can Afford It.

OplossingSolution

Het patroon gebeurtenis bron definieert een benadering voor het verwerken van bewerkingen op gegevens die wordt aangedreven door een reeks gebeurtenissen, die is vastgelegd in een archief alleen toevoegen.The Event Sourcing pattern defines an approach to handling operations on data that's driven by a sequence of events, each of which is recorded in an append-only store. Toepassingscode verzendt een reeks gebeurtenissen die imperatively elke actie die is opgetreden op de gegevens naar de gebeurtenis store beschrijven, waar ze zijn opgeslagen.Application code sends a series of events that imperatively describe each action that has occurred on the data to the event store, where they're persisted. Elke gebeurtenis vertegenwoordigt een aantal wijzigingen in de gegevens (zoals AddedItemToOrder).Each event represents a set of changes to the data (such as AddedItemToOrder).

De gebeurtenissen worden vastgehouden in een archief gebeurtenis die als het systeem van record (de gezaghebbende gegevensbron) over de huidige status van de gegevens optreedt.The events are persisted in an event store that acts as the system of record (the authoritative data source) about the current state of the data. De gebeurtenis store doorgaans deze gebeurtenissen worden gepubliceerd zodat gebruikers kunnen worden gewaarschuwd en ze indien nodig kunnen verwerken.The event store typically publishes these events so that consumers can be notified and can handle them if needed. Consumenten kunnen bijvoorbeeld initiëren van taken die de bewerkingen in de gebeurtenissen die betrekking hebben op andere systemen of andere gekoppelde actie die vereist zijn om de bewerking te voltooien.Consumers could, for example, initiate tasks that apply the operations in the events to other systems, or perform any other associated action that's required to complete the operation. U ziet dat de toepassingscode die de gebeurtenissen genereert is ontkoppeld van de systemen die zich op de gebeurtenissen abonneren.Notice that the application code that generates the events is decoupled from the systems that subscribe to the events.

Standaard gebruik van de gebeurtenissen die zijn gepubliceerd door de gebeurtenis store zijn gerealiseerde weergaven van entiteiten onderhouden terwijl acties in de toepassing worden gewijzigd en voor integratie met externe systemen.Typical uses of the events published by the event store are to maintain materialized views of entities as actions in the application change them, and for integration with external systems. Een systeem kan bijvoorbeeld een gerealiseerde weergave van alle bestellingen die wordt gebruikt voor het vullen van onderdelen van de gebruikersinterface te onderhouden.For example, a system can maintain a materialized view of all customer orders that's used to populate parts of the UI. Als de toepassing nieuwe orders voegt, wordt toegevoegd of verwijderd van de items in de volgorde en back-ups van gegevens worden toegevoegd, de gebeurtenissen die deze wijzigingen worden beschreven, kunnen worden verwerkt en gebruikt om te werken de bekijken gematerialiseerd.As the application adds new orders, adds or removes items on the order, and adds shipping information, the events that describe these changes can be handled and used to update the materialized view.

Op elk gewenst moment is het bovendien mogelijk om toepassingen te lezen van de geschiedenis van gebeurtenissen en deze gebruiken om aan te geven aan de huidige status van een entiteit door afspelen en gebruiken van de gebeurtenissen met betrekking tot die entiteit.In addition, at any point it's possible for applications to read the history of events, and use it to materialize the current state of an entity by playing back and consuming all the events related to that entity. Dit kan gebeuren op aanvraag naar een domeinobject voordoen bij het verwerken van een aanvraag of door een geplande taak zodat de status van de entiteit kan worden opgeslagen als een gerealiseerde weergave, ter ondersteuning van de laag voor presentatie.This can occur on demand to materialize a domain object when handling a request, or through a scheduled task so that the state of the entity can be stored as a materialized view to support the presentation layer.

De afbeelding ziet u een overzicht van het patroon, waaronder een deel van de opties voor het gebruik van de stroom gebeurtenissen zoals een gerealiseerde weergave maakt, gebeurtenissen integratie met externe toepassingen en systemen en gebeurtenissen herstelbewerking projecties van de huidige status van maken specifieke entiteiten.The figure shows an overview of the pattern, including some of the options for using the event stream such as creating a materialized view, integrating events with external applications and systems, and replaying events to create projections of the current state of specific entities.

Een overzicht en een voorbeeld van het patroon bron van gebeurtenis

Het patroon gebeurtenis bron biedt de volgende voordelen:The Event Sourcing pattern provides the following advantages:

Gebeurtenissen zijn onveranderbaar en kunnen worden opgeslagen met behulp van een bewerking alleen toevoegen.Events are immutable and can be stored using an append-only operation. De gebruikersinterface, een werkstroom of een proces dat een gebeurtenis wordt gestart kan worden voortgezet en de gebeurtenissen verwerken taken kunnen uitvoeren op de achtergrond.The user interface, workflow, or process that initiated an event can continue, and tasks that handle the events can run in the background. Deze, in combinatie met het feit dat er geen conflicten tijdens het verwerken van transacties, is aanzienlijk kan verbeteren prestaties en schaalbaarheid voor toepassingen, met name voor de presentatie niveau of de gebruikersinterface.This, combined with the fact that there's no contention during the processing of transactions, can vastly improve performance and scalability for applications, especially for the presentation level or user interface.

Gebeurtenissen zijn eenvoudige objecten die worden beschreven van een bepaalde actie die is opgetreden, samen met alle gekoppelde gegevens die nodig zijn om de actie die wordt vertegenwoordigd door de gebeurtenis te beschrijven.Events are simple objects that describe some action that occurred, together with any associated data required to describe the action represented by the event. Gebeurtenissen bijwerken niet rechtstreeks een gegevensarchief.Events don't directly update a data store. Ze zijn gewoon voor verwerking op het juiste moment vastgelegd.They're simply recorded for handling at the appropriate time. Dit kan de implementatie en beheer vereenvoudigen.This can simplify implementation and management.

Gebeurtenissen hebben doorgaans betekenis voor een expert domein dat object relationele impedantie verschil complexe databasetabellen moeilijk te begrijpen kunt maken.Events typically have meaning for a domain expert, whereas object-relational impedance mismatch can make complex database tables hard to understand. Tabellen zijn kunstmatige constructies die vertegenwoordigen de huidige status van het systeem niet de gebeurtenissen die hebben plaatsgevonden.Tables are artificial constructs that represent the current state of the system, not the events that occurred.

Bron van de gebeurtenis kan helpen voorkomen dat gelijktijdige updates conflicten veroorzaken omdat de vereiste direct bijwerken van objecten in het gegevensarchief wordt voorkomen.Event sourcing can help prevent concurrent updates from causing conflicts because it avoids the requirement to directly update objects in the data store. Het domeinmodel moet nog steeds zijn ontworpen om zich te beschermen van aanvragen die tot een inconsistente status heeft leiden mogelijk.However, the domain model must still be designed to protect itself from requests that might result in an inconsistent state.

De opslag alleen toevoegen van gebeurtenissen biedt een audittrail die kan worden gebruikt voor het bewaken van acties die worden uitgevoerd op basis van een gegevensarchief, opnieuw genereren de huidige status als gerealiseerde weergaven of projecties door de gebeurtenissen op elk gewenst moment en helpt bij het testen en foutopsporing de systeem.The append-only storage of events provides an audit trail that can be used to monitor actions taken against a data store, regenerate the current state as materialized views or projections by replaying the events at any time, and assist in testing and debugging the system. De vereiste compensatie gebeurtenissen gebruiken om wijzigingen te annuleren biedt bovendien een geschiedenis van wijzigingen die zijn omgekeerd die zou niet het geval zijn als het model gewoon de huidige status opgeslagen.In addition, the requirement to use compensating events to cancel changes provides a history of changes that were reversed, which wouldn't be the case if the model simply stored the current state. De lijst met gebeurtenissen kan ook worden gebruikt voor het analyseren van de prestaties van toepassingen en gebruiker gedrag trends te detecteren of andere nuttige informatie te verkrijgen.The list of events can also be used to analyze application performance and detect user behavior trends, or to obtain other useful business information.

De gebeurtenis store wordt een gebeurtenis geactiveerd en taken bewerkingen uitvoeren in reactie op gebeurtenissen.The event store raises events, and tasks perform operations in response to those events. Deze ontkoppeling van de taken van de gebeurtenissen biedt flexibiliteit en uitbreidbaarheid.This decoupling of the tasks from the events provides flexibility and extensibility. Taken weten over het type gebeurtenis en de gebeurtenisgegevens worden opgeslagen, maar niet over de werking dat de gebeurtenis.Tasks know about the type of event and the event data, but not about the operation that triggered the event. Meerdere taken kunnen bovendien elke gebeurtenis te verwerken.In addition, multiple tasks can handle each event. Hierdoor kunnen eenvoudige integratie met andere services en systemen die alleen voor nieuwe gebeurtenissen die worden gegenereerd door de gebeurtenis store luisteren.This enables easy integration with other services and systems that only listen for new events raised by the event store. Echter, de herkomst van gebeurtenis gebeurtenissen zijn meestal zeer laag niveau en kan het nodig zijn voor het genereren van van specifieke integratiegebeurtenissen in plaats daarvan zijn.However, the event sourcing events tend to be very low level, and it might be necessary to generate specific integration events instead.

Bron van de gebeurtenis wordt vaak gecombineerd met het patroon CQRS door de gegevens beheertaken uitvoeren in reactie op de gebeurtenissen en materialiseren weergaven van de opgeslagen gebeurtenissen.Event sourcing is commonly combined with the CQRS pattern by performing the data management tasks in response to the events, and by materializing views from the stored events.

Problemen en overwegingenIssues and considerations

Houd rekening met de volgende punten bij het bepalen van het implementeren van dit patroon:Consider the following points when deciding how to implement this pattern:

Het systeem worden pas uiteindelijk consistent is bij het maken van gematerialiseerd weergaven of genereren projecties van gegevens door gebeurtenissen.The system will only be eventually consistent when creating materialized views or generating projections of data by replaying events. Er is een vertraging tussen een toepassing gebeurtenissen aan het archief van de gebeurtenis toe te voegen als gevolg van een aanvraag verwerkt de gebeurtenissen die worden gepubliceerd en gebruikers van de gebeurtenissen hanteren.There's some delay between an application adding events to the event store as the result of handling a request, the events being published, and consumers of the events handling them. Tijdens deze periode kunnen nieuwe gebeurtenissen die meer entiteiten beschrijven in de winkel gebeurtenis zijn ontvangen.During this period, new events that describe further changes to entities might have arrived at the event store.

Notitie

Zie de gegevens consistentie Primer voor meer informatie over de uiteindelijke consistentie.See the Data Consistency Primer for information about eventual consistency.

Opslag in de gebeurtenis kan de permanente bron van informatie en dus de gebeurtenisgegevens nooit mogen worden bijgewerkt.The event store is the permanent source of information, and so the event data should never be updated. De enige manier om het bijwerken van een entiteit een wijziging ongedaan maken is het toevoegen van een compensatie-gebeurtenis in het archief van de gebeurtenis.The only way to update an entity to undo a change is to add a compensating event to the event store. Als de notatie (in plaats van de gegevens) van de vastgelegde gebeurtenissen wijzigen moet, bijvoorbeeld zijn tijdens een migratie het lastig bestaande gebeurtenissen in het archief combineren met de nieuwe versie.If the format (rather than the data) of the persisted events needs to change, perhaps during a migration, it can be difficult to combine existing events in the store with the new version. Kan het nodig zijn de gebeurtenissen die u wijzigingen aanbrengt, zodat ze voldoen aan de nieuwe indeling doorlopen, of het toevoegen van nieuwe gebeurtenissen die gebruikmaken van de nieuwe indeling.It might be necessary to iterate through all the events making changes so they're compliant with the new format, or add new events that use the new format. Overweeg het gebruik van een versienummer op elke versie van het schema van de gebeurtenis zowel het oude en nieuwe gebeurtenis opmaak onderhouden.Consider using a version stamp on each version of the event schema to maintain both the old and the new event formats.

Toepassingen met meerdere threads en meerdere exemplaren van toepassingen mogelijk gebeurtenissen worden opgeslagen in het archief van de gebeurtenis.Multi-threaded applications and multiple instances of applications might be storing events in the event store. De consistentie van gebeurtenissen in het archief van de gebeurtenis is van cruciaal belang omdat de volgorde van gebeurtenissen die betrekking hebben op een specifieke entiteit (de volgorde waarin wijzigingen naar een entiteit plaatsvinden van invloed op de huidige status).The consistency of events in the event store is vital, as is the order of events that affect a specific entity (the order that changes occur to an entity affects its current state). Een tijdstempel toe te voegen aan elke gebeurtenis kan helpen problemen te vermijden.Adding a timestamp to every event can help to avoid issues. Er is een andere gangbare praktijk aantekeningen toevoegen aan elke gebeurtenis ten gevolge van een aanvraag met een incrementele id.Another common practice is to annotate each event resulting from a request with an incremental identifier. Als twee acties probeert toe te voegen van gebeurtenissen voor dezelfde entiteit op hetzelfde moment, kan het archief gebeurtenis een gebeurtenis die overeenkomt met een bestaande entiteits-id en de gebeurtenis-id weigeren.If two actions attempt to add events for the same entity at the same time, the event store can reject an event that matches an existing entity identifier and event identifier.

Er is geen standaard benadering, of een bestaande mechanismen zoals SQL-query's voor het lezen van de gebeurtenissen om informatie te verkrijgen.There's no standard approach, or existing mechanisms such as SQL queries, for reading the events to obtain information. De enige gegevens die kan worden geëxtraheerd is een stream van gebeurtenissen met een gebeurtenis-id als de criteria.The only data that can be extracted is a stream of events using an event identifier as the criteria. De gebeurtenis-ID is doorgaans toegewezen aan afzonderlijke entiteiten.The event ID typically maps to individual entities. De huidige status van een entiteit kan alleen door alle gebeurtenissen die betrekking op deze op basis van de oorspronkelijke status van die entiteit hebben worden bepaald.The current state of an entity can be determined only by replaying all of the events that relate to it against the original state of that entity.

De lengte van elke gebeurtenisstroom beïnvloedt beheren en bijwerken van het systeem.The length of each event stream affects managing and updating the system. Als de stromen groot zijn, kunt u het maken van momentopnamen met een bepaald interval, zoals een opgegeven aantal gebeurtenissen.If the streams are large, consider creating snapshots at specific intervals such as a specified number of events. De huidige status van de entiteit kan worden verkregen van de momentopname en door alle gebeurtenissen die is opgetreden nadat die tijdstip voor herstel.The current state of the entity can be obtained from the snapshot and by replaying any events that occurred after that point in time. Zie voor meer informatie over het maken van momentopnamen van gegevens momentopname op to Fowler van Enterprise-toepassingsarchitectuur website en Master slave momentopnamereplicatie.For more information about creating snapshots of data, see Snapshot on Martin Fowler’s Enterprise Application Architecture website and Master-Subordinate Snapshot Replication.

Hoewel de bron van gebeurtenis minimaliseert de kans op conflicterende updates in de gegevens, kunnen de toepassing moet nog steeds bekommeren om inconsistenties die resulteren uit de uiteindelijke consistentie en het ontbreken van transacties.Even though event sourcing minimizes the chance of conflicting updates to the data, the application must still be able to deal with inconsistencies that result from eventual consistency and the lack of transactions. Een gebeurtenis die een afname in de voorraad voorraad aangeeft kan bijvoorbeeld bezorgd in het gegevensarchief terwijl een volgorde voor dat het item wordt geplaatst, wat resulteert in een vereiste om af te stemmen deze twee bewerkingen door de klant adviseren of het maken van een back-volgorde.For example, an event that indicates a reduction in stock inventory might arrive in the data store while an order for that item is being placed, resulting in a requirement to reconcile the two operations either by advising the customer or creating a back order.

Publicatie van de gebeurtenis mogelijk 'ten minste eenmaal' en consumenten van de gebeurtenissen moet dus idempotent.Event publication might be “at least once,” and so consumers of the events must be idempotent. Deze moeten niet opnieuw toepassen voor de updates beschreven in een gebeurtenis als de gebeurtenis is meer dan één keer verwerkt.They must not reapply the update described in an event if the event is handled more than once. Als meerdere exemplaren van een consumer een statistische functie van een entiteit eigenschap, zoals het totale aantal orders geplaatst onderhoudt, kunt u voor slechts één, moet slagen in de statistische functie verhoogd wanneer een bestelling geplaatst gebeurtenis plaatsvindt.For example, if multiple instances of a consumer maintain an aggregate an entity's property, such as the total number of orders placed, only one must succeed in incrementing the aggregate when an order placed event occurs. Hoewel dit niet een belangrijke kenmerken van gebeurtenis bron is, is de gebruikelijke implementatie beslissing.While this isn't a key characteristic of event sourcing, it's the usual implementation decision.

Het gebruik van dit patroonWhen to use this pattern

Gebruik dit patroon in de volgende scenario's:Use this pattern in the following scenarios:

  • Als u wilt vastleggen bedoelingen, doel of de reden hiervoor in de gegevens.When you want to capture intent, purpose, or reason in the data. Bijvoorbeeld: wijzigingen in de entiteit van een klant kunnen worden vastgelegd als een reeks specifieke gebeurtenistypen zoals verplaatste home, gesloten account, of overleden.For example, changes to a customer entity can be captured as a series of specific event types such as Moved home, Closed account, or Deceased.

  • Wanneer is het essentieel om te beperken of volledig te voorkomen dat het exemplaar van conflicterende updates van gegevens.When it's vital to minimize or completely avoid the occurrence of conflicting updates to data.

  • Als u wilt vastleggen van gebeurtenissen die optreden en kunnen ze voor het herstellen van de status van een systeem, terugdraaien van wijzigingen, of een bijhouden en auditlogboek.When you want to record events that occur, and be able to replay them to restore the state of a system, roll back changes, or keep a history and audit log. Bijvoorbeeld, wanneer een taak bestaat uit meerdere stappen mogelijk moet u uitvoeren van acties voor het herstellen van updates en vervolgens opnieuw een aantal stappen om de gegevens terug in een consistente status.For example, when a task involves multiple steps you might need to execute actions to revert updates and then replay some steps to bring the data back into a consistent state.

  • Wanneer u gebeurtenissen is een natuurlijke functie van de werking van de toepassing en vereist weinig extra ontwikkeling of implementatie inspanning.When using events is a natural feature of the operation of the application, and requires little additional development or implementation effort.

  • Wanneer u wilt loskoppelen van het proces van invoeren of bijwerken van gegevens van de vereiste taken voor het toepassen van deze acties.When you need to decouple the process of inputting or updating data from the tasks required to apply these actions. Dit wordt mogelijk de UI-prestaties te verbeteren, of voor het distribueren van gebeurtenissen naar andere-listeners die maatregelen nemen wanneer de gebeurtenissen plaatsvinden.This might be to improve UI performance, or to distribute events to other listeners that take action when the events occur. Bijvoorbeeld, integreren een salarissysteem met een website van de verzending van onkosten zodat gebeurtenissen die worden gegenereerd door de gebeurtenis opslaan in reactie op wijzigingen in de website worden verbruikt door de website en de salarisadministratie gegevens.For example, integrating a payroll system with an expense submission website so that events raised by the event store in response to data updates made in the website are consumed by both the website and the payroll system.

  • Als u wilt dat de flexibiliteit om te kunnen wijzigen van de indeling van het gerealiseerde modellen en entiteitsgegevens als vereisten wijzigt, of—wanneer gebruikt in combinatie met CQRS—moet u een lezen model of de weergaven die de gegevens kunnen aanpassen.When you want flexibility to be able to change the format of materialized models and entity data if requirements change, or—when used in conjunction with CQRS—you need to adapt a read model or the views that expose the data.

  • Wanneer gebruikt in combinatie met CQRS, en uiteindelijk is consistentie acceptabel terwijl een lezen model wordt bijgewerkt, of de prestatie-invloed van rehydrating entiteiten en gegevens uit een stroom gebeurtenissen geaccepteerd wordt.When used in conjunction with CQRS, and eventual consistency is acceptable while a read model is updated, or the performance impact of rehydrating entities and data from an event stream is acceptable.

Dit patroon kan niet nuttig zijn in de volgende situaties:This pattern might not be useful in the following situations:

  • Kleine of eenvoudige domeinen, systemen waarop weinig of geen bedrijfslogica of controller systemen die natuurlijk goed met traditionele CRUD data management mechanismen werken.Small or simple domains, systems that have little or no business logic, or nondomain systems that naturally work well with traditional CRUD data management mechanisms.

  • Systemen waarop consistentie en real-time updates voor de weergaven van de gegevens vereist zijn.Systems where consistency and real-time updates to the views of the data are required.

  • Systemen waarop audit muissporen, geschiedenis en mogelijkheden voor het ongedaan maken en replay-acties zijn niet vereist.Systems where audit trails, history, and capabilities to roll back and replay actions are not required.

  • Systemen waarbij er alleen een zeer lage exemplaar van conflicterende updates in de onderliggende gegevens.Systems where there's only a very low occurrence of conflicting updates to the underlying data. Bijvoorbeeld: systemen die hoofdzakelijk toevoegen van gegevens in plaats van wordt bijgewerkt.For example, systems that predominantly add data rather than updating it.

VoorbeeldExample

Een conferentie beheersysteem moet het aantal voltooide reserveringen voor een conferentie bijhouden, zodat deze controleren kunt of er seats nog steeds beschikbaar zijn wanneer een potentiële aanwezige probeert te maken van een reservering.A conference management system needs to track the number of completed bookings for a conference so that it can check whether there are seats still available when a potential attendee tries to make a booking. Het systeem kan het totale aantal reserveringen voor een conferentie opslaan op ten minste twee manieren:The system could store the total number of bookings for a conference in at least two ways:

  • Het systeem kan de informatie over het totale aantal reserveringen opslaan als een afzonderlijke entiteit in een database die reservering informatie bevat.The system could store the information about the total number of bookings as a separate entity in a database that holds booking information. Als er reserveringen worden aangebracht of geannuleerd, kan het systeem verhogen of verlagen van dit aantal naar gelang van toepassing.As bookings are made or canceled, the system could increment or decrement this number as appropriate. Deze aanpak is eenvoudig in theorie, maar kan schaalbaarheidsproblemen veroorzaken als een groot aantal deelnemers te plaatsen dat adresboek gedurende een korte periode probeert.This approach is simple in theory, but can cause scalability issues if a large number of attendees are attempting to book seats during a short period of time. Bijvoorbeeld, in de laatste dag of dus vóór de reservering periode afsluiten.For example, in the last day or so prior to the booking period closing.

  • Het systeem kan informatie over reserveringen en annuleringen opslaan als gebeurtenissen ondergebracht in een store gebeurtenis.The system could store information about bookings and cancellations as events held in an event store. Deze kan vervolgens het aantal beschikbare seats berekenen door deze gebeurtenissen.It could then calculate the number of seats available by replaying these events. Deze methode kan worden meer schaalbare vanwege zorgen van gebeurtenissen.This approach can be more scalable due to the immutability of events. Het systeem moet alleen gegevens lezen uit het archief van de gebeurtenis of gegevens toevoegen aan het archief van de gebeurtenis.The system only needs to be able to read data from the event store, or append data to the event store. Gebeurtenisinformatie over reserveringen en annuleringen nooit wordt gewijzigd.Event information about bookings and cancellations is never modified.

Het volgende diagram illustreert hoe het subsysteem seat reservering van het beheersysteem conferentie kan zijn geïmplementeerd met gebeurtenis bron.The following diagram illustrates how the seat reservation subsystem of the conference management system might be implemented using event sourcing.

Met behulp van de bron voor het vastleggen van informatie over seat reserveringen in een vergaderruimte beheersysteem gebeurtenis

De volgorde van de acties voor het reserveren van twee seats is als volgt:The sequence of actions for reserving two seats is as follows:

  1. De gebruikersinterface geeft een opdracht voor het reserveren van plaatsen voor twee deelnemers.The user interface issues a command to reserve seats for two attendees. De opdracht wordt verwerkt door de opdrachthandler van een afzonderlijke.The command is handled by a separate command handler. Een stukje logica die is losgekoppeld van de gebruikersinterface van en is verantwoordelijk voor het verwerken van aanvragen die worden gepubliceerd als opdrachten.A piece of logic that is decoupled from the user interface and is responsible for handling requests posted as commands.

  2. Een statistische functie met informatie over alle reserveringen voor de conferentie is opgesteld door het opvragen van de gebeurtenissen die worden beschreven reserveringen en annuleringen.An aggregate containing information about all reservations for the conference is constructed by querying the events that describe bookings and cancellations. Deze combinatie wordt aangeroepen SeatAvailability, en is opgenomen in een domeinmodel dat methoden beschrijft voor het uitvoeren van query's en de gegevens de wijzigen.This aggregate is called SeatAvailability, and is contained within a domain model that exposes methods for querying and modifying the data in the aggregate.

    Sommige optimalisaties rekening houden met momentopnamen gebruikt (zodat u hoeft niet te vragen en in de volledige lijst met gebeurtenissen om op te halen van de huidige status van de statistische functie replay), en een cachekopie van de statistische functie in het geheugen te bewaren.Some optimizations to consider are using snapshots (so that you don’t need to query and replay the full list of events to obtain the current state of the aggregate), and maintaining a cached copy of the aggregate in memory.

  3. Opdrachthandler roept een methode die worden weergegeven door het domeinmodel in de reserveringen maken.The command handler invokes a method exposed by the domain model to make the reservations.

  4. De SeatAvailability statistische functie registreert een gebeurtenis die het aantal plaatsen die zijn gereserveerd.The SeatAvailability aggregate records an event containing the number of seats that were reserved. De volgende keer dat de statistische functie is van toepassing gebeurtenissen, wordt de reserveringen gebruikt om te berekenen hoeveel seats blijven.The next time the aggregate applies events, all the reservations will be used to compute how many seats remain.

  5. Het systeem worden de nieuwe gebeurtenis toegevoegd aan de lijst met gebeurtenissen in het archief van de gebeurtenis.The system appends the new event to the list of events in the event store.

Als een gebruiker een seat annuleert, wordt door het systeem een soortgelijk proces volgt, behalve opdrachthandler verstrekt een opdracht die een gebeurtenis van de annulering seat genereert en voegt deze toe aan het archief van de gebeurtenis.If a user cancels a seat, the system follows a similar process except the command handler issues a command that generates a seat cancellation event and appends it to the event store.

En bieden meer mogelijkheden voor schaalbaarheid, biedt met behulp van een gebeurtenis store ook een volledige geschiedenis of de audittrail van de reserveringen en annuleringen voor een vergaderruimte.As well as providing more scope for scalability, using an event store also provides a complete history, or audit trail, of the bookings and cancellations for a conference. De gebeurtenissen in het archief van de gebeurtenis zijn de nauwkeurige record.The events in the event store are the accurate record. Er is niet nodig om vast te leggen statistische functies in een andere manier omdat het systeem kan eenvoudig opnieuw afspelen van de gebeurtenissen en de status naar een willekeurig punt in tijd herstellen.There is no need to persist aggregates in any other way because the system can easily replay the events and restore the state to any point in time.

U vindt meer informatie over dit voorbeeld in bron van gebeurtenis Introducing.You can find more information about this example in Introducing Event Sourcing.

De volgende patronen en richtlijnen mogelijk ook relevant zijn bij het implementeren van dit patroon:The following patterns and guidance might also be relevant when implementing this pattern:

  • Opdracht en query's uitvoeren verantwoordelijkheid scheiding (CQRS) patroon.Command and Query Responsibility Segregation (CQRS) Pattern. Het archief schrijven waarmee de permanente bron van informatie voor een CQRS-implementatie is vaak op basis van een implementatie van het patroon gebeurtenis bron.The write store that provides the permanent source of information for a CQRS implementation is often based on an implementation of the Event Sourcing pattern. Beschrijft hoe de bewerkingen die gegevens in een toepassing te van de bewerkingen die gegevens bijwerken lezen met behulp van afzonderlijke interfaces te scheiden.Describes how to segregate the operations that read data in an application from the operations that update data by using separate interfaces.

  • Patroon bekijken gematerialiseerd.Materialized View Pattern. Het gegevensarchief gebruikt in een systeem dat op basis van de bron van de gebeurtenis is doorgaans niet goed geschikt voor het efficiënt doorzoeken.The data store used in a system based on event sourcing is typically not well suited to efficient querying. In plaats daarvan is een veelgebruikte oplossing voor het genereren van vooraf ingevulde weergaven van de gegevens met regelmatige tussenpozen, of wanneer de gegevens worden gewijzigd.Instead, a common approach is to generate prepopulated views of the data at regular intervals, or when the data changes. Toont hoe u dit kunt doen.Shows how this can be done.

  • Transactie-patroon Compensating.Compensating Transaction Pattern. De bestaande gegevens in een gebeurtenis sourcing store niet wordt bijgewerkt, wordt in plaats daarvan nieuwe vermeldingen die overgang van de status van de entiteiten worden toegevoegd aan de nieuwe waarden.The existing data in an event sourcing store is not updated, instead new entries are added that transition the state of entities to the new values. Als u wilt een wijziging ongedaan, compensatie items worden gebruikt omdat het niet mogelijk is gewoon de vorige wijziging ongedaan.To reverse a change, compensating entries are used because it isn't possible to simply reverse the previous change. Beschrijft hoe het werk dat is uitgevoerd door een eerdere bewerking ongedaan te maken.Describes how to undo the work that was performed by a previous operation.

  • Gegevens consistentie Primer.Data Consistency Primer. Wanneer gebeurtenis met een afzonderlijke bron lezen store of gematerialiseerd weergaven, de gelezen gegevens niet onmiddellijk consistente, in plaats daarvan het er waarschijnlijk alleen uiteindelijk consistent is.When using event sourcing with a separate read store or materialized views, the read data won't be immediately consistent, instead it'll be only eventually consistent. Geeft een overzicht van de problemen beheren consistentie omringende via gedistribueerde gegevens.Summarizes the issues surrounding maintaining consistency over distributed data.

  • Gegevens richtlijnen partitioneren.Data Partitioning Guidance. De gegevens zijn vaak gepartitioneerd als u van gebeurtenis bron voor de schaalbaarheid wordt verbeterd, conflicten te verlagen en de prestaties optimaliseren.Data is often partitioned when using event sourcing to improve scalability, reduce contention, and optimize performance. Beschrijft hoe u gegevens verdelen in afzonderlijke partities en de problemen die zich kunnen voordoen.Describes how to divide data into discrete partitions, and the issues that can arise.

  • Greg Young van post waarom gebruiken gebeurtenis bron?.Greg Young’s post Why use Event Sourcing?.