ΠΠ°ΡΠ΅ΠΌ Ρ ΡΠ°Π½ΠΈΡΡ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ?
ΠΠ»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΡΠ°ΠΉΡΠ° ΠΈΠ»ΠΈ Π±Π΅ΠΊΡΠ½Π΄Π° ΠΏΠ΅ΡΠ²ΡΠΌ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° Π·Π΄ΡΠ°Π²ΠΎΠΌΡΡΠ»ΡΡΠΈΡ Π»ΡΠ΄Π΅ΠΉ Π²ΡΠ±Π΅ΡΠ΅Ρ SQL Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ .Β
ΠΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π² Π³ΠΎΠ»ΠΎΠ²Ρ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΠΌΡΡΠ»Ρ ΡΡΠΎ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ SQL: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΈΠ»ΠΈ ΡΠΎΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π³ΡΠ°ΡΠ° Π½ΡΠΆΠ΅Π½ ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΌ ΡΠ²ΡΠ·ΡΠΌ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ.Β
Π₯ΡΠΆΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅, ΠΈ ΠΊΠΎΠ»Π»Π΅Π³Π° Π½Π΅ ΡΠΌΠ΅Π΅Ρ ΡΡΡΠΎΠΈΡΡ Π±ΡΡΡΡΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ. Π‘ΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²Ρ ΠΏΠΎΡΡΠ°ΡΠΈΠ»ΠΈ Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ N+1 ΠΈ Π½Π° ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ², ΡΡΠΎΠ±Ρ SELECT Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΎΡΡΠ°Π±Π°ΡΡΠ²Π°Π» Π·Π° ΡΠ°Π·ΡΠΌΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ?
ΠΡΡΠ³ΠΈΠΌ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ NoSQL. ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π»Π΅Ρ Π½Π°Π·Π°Π΄ Π±ΡΠ» Π±ΠΎΠ»ΡΡΠΎΠΉ Ρ Π°ΠΉΠΏ Π²ΠΎΠΊΡΡΠ³ ΡΡΠΎΠΉ ΡΠ΅ΠΌΡ β Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°Ρ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π»ΠΈ MongoDB ΠΈ ΡΠ°Π΄ΠΎΠ²Π°Π»ΠΈΡΡ ΠΎΡΠ²Π΅ΡΠ°ΠΌ Π² Π²ΠΈΠ΄Π΅ json-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² (ΠΊΡΡΠ°ΡΠΈ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΡΡΡΠ»Π΅ΠΉ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π²ΡΡΠ°Π²ΠΈΡΡ ΠΈΠ·-Π·Π° ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΡΠ»ΠΎΠΊ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Ρ ?).
Π― ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½, Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± β ΠΏΠΎΡΠ΅ΠΌΡ Π±Ρ Π½Π΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Ρ ΡΠ°Π½ΠΈΡΡ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ (ΡΠ°ΠΉΠ», ΡΠ΄Π°Π»Π΅Π½Π½Π°Ρ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ )?Β
ΠΠ°ΠΌΡΡΡ ΡΡΠ°Π»Π° Π΄Π΅ΡΡΠ²ΠΎΠΉ, Π° Π»ΡΠ±ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΠΌΠ°Π»ΡΡ ΠΈ ΡΡΠ΅Π΄Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π²Π»Π΅Π·ΡΡ Π² 1 ΠΠ± ΠΏΠ°ΠΌΡΡΠΈ. (ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΉ Π»ΡΠ±ΠΈΠΌΡΠΉ Π΄ΠΎΠΌΠ°ΡΠ½ΠΈΠΉ ΠΏΡΠΎΠ΅ΠΊΡ β , ΠΊΠΎΡΠΎΡΡΠΉ Π²Π΅Π΄Π΅Ρ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΈ ΠΈΡΡΠΎΡΠΈΡ ΠΌΠΎΠΈΡ ΡΡΠ°Ρ, Π±Π°Π»Π°Π½ΡΠΎΠ², ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π·Π° ΠΏΠΎΠ»ΡΠΎΡΠ° Π³ΠΎΠ΄Π° ΠΏΠΎΡΡΠ΅Π±Π»ΡΠ΅Ρ Π²ΡΠ΅Π³ΠΎ 45 ΠΠ± ΠΏΠ°ΠΌΡΡΠΈ.)
ΠΠ»ΡΡΡ:
- ΠΠΎΡΡΡΠΏ ΠΊ Π΄Π°Π½Π½ΡΠΌ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΡΠΎΡΠ΅ β Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ Π·Π°ΠΏΡΠΎΡΠ°Ρ , Π»Π΅Π½ΠΈΠ²ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠ΅, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ ORM, ΡΠ°Π±ΠΎΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Ρ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ C# ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ;
- ΠΠ΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΈΠ· ΡΠ°Π·Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²;
- ΠΡΠ΅Π½Ρ Π±ΡΡΡΡΠΎ β Π½Π΅ΡΡ ΡΠ΅ΡΠ΅Π²ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΡ ΠΊΠΎΠ΄Π° Π² ΡΠ·ΡΠΊ Π·Π°ΠΏΡΠΎΡΠΎΠ², Π½Π΅ Π½ΡΠΆΠ½Π° (Π΄Π΅)ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²;
- ΠΠΎΠΏΡΡΡΠΈΠΌΠΎ Ρ ΡΠ°Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² Π»ΡΠ±ΠΎΠΌ Π²ΠΈΠ΄Π΅ β Ρ ΠΎΡΡ Π² XML Π½Π° Π΄ΠΈΡΠΊΠ΅, Ρ ΠΎΡΡ Π² SQL Server, Ρ ΠΎΡΡ Π² Azure Table Storage.
ΠΠΈΠ½ΡΡΡ:
- Π’Π΅ΡΡΠ΅ΡΡΡ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΈ ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ Π½Π΅Π»ΡΠ·Ρ ΡΠ΄Π΅Π»Π°ΡΡ zero downtime deployment;
- ΠΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΏΠ°Π΄Π΅Ρ β ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΠΎΡΠ΅ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅. (ΠΠΎ Π²Π΅Π΄Ρ Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅-ΡΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠ°Π΄Π°Π΅Ρ, ΠΏΡΠ°Π²Π΄Π°?)
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ?
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
- ΠΠ° ΡΡΠ°ΡΡΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ , ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π·Π°Π³ΡΡΠ·ΠΊΠ° Π΄Π°Π½Π½ΡΡ ;
- Π‘ΡΡΠΎΠΈΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ, ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ, ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ (1:1, 1:Many);
- Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (INotifyPropertyChanged) ΠΈ Π½Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ (INotifyCollectionChanged);
- ΠΡΠΈ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ β ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ²ΡΠΈΠΉΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° Π·Π°ΠΏΠΈΡΡ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π΄Π°Π½Π½ΡΡ ;
- ΠΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ (ΠΏΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΡ) Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅;
- ΠΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ ΠΈΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π°
ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
// ΠΡΠ½ΠΎΠ²Π½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°
Install-Package OutCode.EscapeTeams.ObjectRepository
Β Β Β
// Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π΄Π°Π½Π½ΡΡ
, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄ΡΡ ΡΠΎΡ
ΡΠ°Π½ΡΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ
// ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΎ, ΠΊΠΎΡΠΎΡΡΠΌ Π±ΡΠ΄Π΅ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ.
Install-Package OutCode.EscapeTeams.ObjectRepository.File
Install-Package OutCode.EscapeTeams.ObjectRepository.LiteDb
Install-Package OutCode.EscapeTeams.ObjectRepository.AzureTableStorage
Β Β Β
// ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ - Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ Ρ
ΡΠ°Π½ΠΈΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ Hangfire
// Install-Package OutCode.EscapeTeams.ObjectRepository.HangfireΠΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅
public class ParentEntity : BaseEntity
{
Β Β public ParentEntity(Guid id) => Id = id;
}
Β Β Β
public class ChildEntity : BaseEntity
{
Β Β public ChildEntity(Guid id) => Id = id;
Β Β public Guid ParentId { get; set; }
Β Β public string Value { get; set; }
}ΠΠ°ΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ:
public class ParentModel : ModelBase
{
Β Β public ParentModel(ParentEntity entity)
Β Β {
Β Β Β Β Entity = entity;
Β Β }
Β Β Β
Β Β public ParentModel()
Β Β {
Β Β Β Β Entity = new ParentEntity(Guid.NewGuid());
Β Β }
Β Β Β
Β Β public Guid? NullableId => null;
Β Β Β
Β Β // ΠΡΠΈΠΌΠ΅Ρ ΡΠ²ΡΠ·ΠΈ 1:Many
Β Β public IEnumerable<ChildModel> Children => Multiple<ChildModel>(x => x.ParentId);
Β Β Β
Β Β protected override BaseEntity Entity { get; }
}
Β Β Β
public class ChildModel : ModelBase
{
Β Β private ChildEntity _childEntity;
Β Β Β
Β Β public ChildModel(ChildEntity entity)
Β Β {
Β Β Β Β _childEntity = entity;
Β Β }
Β Β Β
Β Β public ChildModel()Β
Β Β {
Β Β Β Β _childEntity = new ChildEntity(Guid.NewGuid());
Β Β }
Β Β Β
Β Β public Guid ParentId
Β Β {
Β Β Β Β get => _childEntity.ParentId;
Β Β Β Β set => UpdateProperty(() => _childEntity.ParentId, value);
Β Β }
Β Β Β
Β Β public string Value
Β Β {
Β Β Β Β get => _childEntity.Value;
Β Β Β Β set => UpdateProperty(() => _childEntity.Value, value
Β Β }
Β Β Β
Β Β // ΠΠΎΡΡΡΠΏ Ρ ΠΏΠΎΠΈΡΠΊΠΎΠΌ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ
Β Β public ParentModel Parent => Single<ParentModel>(ParentId);
Β Β Β
Β Β protected override BaseEntity Entity => _childEntity;
}Π Π½Π°ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΌ ΠΊΠ»Π°ΡΡ-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄Π°Π½Π½ΡΠΌ:
public class MyObjectRepository : ObjectRepositoryBase
{
Β Β public MyObjectRepository(IStorage storage) : base(storage, NullLogger.Instance)
Β Β {
Β Β Β Β IsReadOnly = true; // ΠΠ»Ρ ΡΠ΅ΡΡΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π΅ ΡΠΎΡ
ΡΠ°Π½ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π±Π°Π·Ρ
Β Β Β
Β Β Β Β AddType((ParentEntity x) => new ParentModel(x));
Β Β Β Β AddType((ChildEntity x) => new ChildModel(x));
Β Β Β
Β Β Β Β // ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Hangfire ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Ρ
ΡΠ°Π½ΠΈΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ Hangfire Π² ObjectRepository
Β Β Β Β // this.RegisterHangfireScheme();Β
Β Β Β
Β Β Β Β Initialize();
Β Β }
}Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ObjectRepository:
var memory = new MemoryStream();
var db = new LiteDatabase(memory);
var dbStorage = new LiteDbStorage(db);
Β Β Β
var repository = new MyObjectRepository(dbStorage);
await repository.WaitForInitialize();ΠΡΠ»ΠΈ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ HangFire
public void ConfigureServices(IServiceCollection services, ObjectRepository objectRepository)
{
Β Β services.AddHangfire(s => s.UseHangfireStorage(objectRepository));
}ΠΡΡΠ°Π²ΠΊΠ° Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°:
var newParent = new ParentModel()
repository.Add(newParent);ΠΡΠΈ ΡΡΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ ΠΎΠ±ΡΠ΅ΠΊΡ ParentModel Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΈ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΊΡΡ, ΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° Π·Π°ΠΏΠΈΡΡ Π² Π±Π°Π·Ρ. ΠΠΎΡΡΠΎΠΌΡ ΡΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ O(1), ΠΈ Ρ ΡΡΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠ°Π·Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ ΡΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ ΡΡΠΎ Π²Π΅ΡΠ½ΡΠ²ΡΠΈΠΉΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ:
var parents = repository.Set<ParentModel>();
var myParent = parents.Find(newParent.Id);
Assert.IsTrue(ReferenceEquals(myParent, newParent));Π§ΡΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ? Set<ParentModel>() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ TableDictionary<ParentModel>, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅ ConcurrentDictionary<ParentModel, ParentModel> ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΡ ΠΈ Π²ΡΠΎΡΠΈΡΠ½ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ². ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ Id (ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌ) Π±Π΅Π· ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
ΠΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ObjectRepository Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΡ
ΡΠ²ΠΎΠΉΡΡΠ², ΠΏΠΎΡΡΠΎΠΌΡ Π»ΡΠ±ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ² ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° Π·Π°ΠΏΠΈΡΡ.Β
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ² ΡΠ½Π°ΡΡΠΆΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ POCO-ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ:
myParent.Children.First().Property = "Updated value";Π£Π΄Π°Π»ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ:
repository.Remove(myParent);
repository.RemoveRange(otherParents);
repository.Remove<ParentModel>(x => !x.Children.Any());ΠΡΠΈ ΡΡΠΎΠΌ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅.
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅?
ObjectRepository ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅, ΡΠ°ΠΊ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²) Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ ModelChanged, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ IStorage. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ IStorage ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ ModelChanged ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² 3 ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ β Π½Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅, Π½Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΠΈ Π½Π° ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅.
Π’Π°ΠΊΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ IStorage ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠΌΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠ°ΠΆΠ΄ΡΠ΅ 5 ΡΠ΅ΠΊΡΠ½Π΄ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.Β
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ API Π΄Π»Ρ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ: ObjectRepository.Save().
ΠΠ΅ΡΠ΅Π΄ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ β ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠ΅Π½ΡΠ»ΡΡ Π΄Π²Π°ΠΆΠ΄Ρ ΠΈΠ»ΠΈ Π±ΡΡΡΡΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²), ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌ ΡΠ°ΠΌΠΎ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅.Β
ΠΠΎ Π²ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΡΠ΅ΠΌ ΠΌΠ΅Π½ΡΠ»ΠΈΡΡ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΌΠΎΠ³ΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠ΅ΠΌ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ.
Π§ΡΠΎ Π΅ΡΡΡ Π΅ΡΡ?
- ΠΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΎΡΠ½ΠΎΠ²Π°Π½Ρ Π½Π° .NET Standard 2.0. ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ .NET ΠΏΡΠΎΠ΅ΠΊΡΠ΅.
- API ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½. ΠΠ½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π½Π° Π±Π°Π·Π΅ ConcurrentDictionary, ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈΠΌΠ΅ΡΡ Π»ΠΈΠ±ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π»ΠΈΠ±ΠΎ Π½Π΅ Π½ΡΠΆΠ΄Π°ΡΡΡΡ Π² Π½ΠΈΡ
.Β
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΎ ΡΠ΅ΠΌ ΡΡΠΎΠΈΡ ΠΏΠΎΠΌΠ½ΠΈΡΡ β ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΡΠ·Π²Π°ΡΡ ObjectRepository.Save(); - ΠΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ (ΡΡΠ΅Π±ΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΡΡΡ):
repository.Set<ChildModel>().AddIndex(x => x.Value);
repository.Set<ChildModel>().Find(x => x.Value, "myValue");ΠΡΠΎ ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ?
ΠΠΈΡΠ½ΠΎ Ρ Π½Π°ΡΠ°Π» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π²ΠΎ Π²ΡΠ΅Ρ Ρ ΠΎΠ±Π±ΠΈ-ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ , ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, ΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΈΡ Π·Π°ΡΡΠ°Ρ Π½Π° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ»ΠΎΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄Π°Π½Π½ΡΠΌ ΠΈΠ»ΠΈ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΡΡΠΆΠ΅Π»ΠΎΠΉ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ. ΠΠΈΡΠ½ΠΎ ΠΌΠ½Π΅, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ Π² litedb ΠΈΠ»ΠΈ Π² ΡΠ°ΠΉΠ»Π΅.Β
ΠΠΎ Π² ΠΏΡΠΎΡΠ»ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π΄Π΅Π»Π°Π»ΠΈ Π½ΡΠ½Π΅ ΠΏΠΎΡΠΈΠ²ΡΠΈΠΉ ΡΡΠ°ΡΡΠ°ΠΏ EscapeTeams (Π΄ΡΠΌΠ°Π» Π²ΠΎΡ ΠΎΠ½ΠΈ, Π΄Π΅Π½ΡΠ³ΠΈ β Π°Π½ Π½Π΅Ρ, ΠΎΠΏΡΡΡ ΠΎΠΏΡΡ) β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ Azure Table Storage.
ΠΠ»Π°Π½Ρ Π½Π° Π±ΡΠ΄ΡΡΠ΅Π΅
Π₯ΠΎΡΠ΅ΡΡΡ ΠΏΠΎΡΠΈΠ½ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΌΠΈΠ½ΡΡΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° β Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½Ρ Π»ΠΈΠ±ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ (sic!), Π»ΠΈΠ±ΠΎ ΠΏΡΠΈΠ½ΡΡΡ Π²ΠΎΠ»Π΅Π²ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΠ°Π·Π½ΡΡ ΠΈΠ½ΡΡΠ°Π½ΡΠΎΠ² ΠΌΠ΅Π½ΡΡΡΡΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ, Π»ΠΈΠ±ΠΎ ΠΏΡΡΠΊΠ°ΠΉ ΠΌΠ΅Π½ΡΡΡΡΡ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ Β«ΠΊΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ β ΡΠΎΡ ΠΈ ΠΏΡΠ°Π²Β».
Π‘ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Ρ Π²ΠΈΠΆΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡ Π΅ΠΌΡ:
- Π₯ΡΠ°Π½ΠΈΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ EventLog ΠΈ Snapshot
- ΠΠ°Ρ ΠΎΠ΄ΠΈΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΡ (Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ Π²ΡΠ΅Ρ ΠΈΠ½ΡΡΠ°Π½ΡΠΎΠ²? udp discovery? master/slave?)
- Π Π΅ΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ½ΡΡΠ°Π½ΡΠ°ΠΌΠΈ EventLog ΡΠ΅ΡΠ΅Π· Π»ΡΠ±ΠΎΠΉ ΠΈΠ· Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ RAFT.
Π’Π°ΠΊ ΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΅ΡΡ ΠΎΠ΄Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠ΅Π½Ρ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ β ΡΡΠΎ ΠΊΠ°ΡΠΊΠ°Π΄Π½ΠΎΠ΅ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅, Π»ΠΈΠ±ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»ΡΡΠ°Π΅Π² ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ Π΅ΡΡΡ ΡΡΡΠ»ΠΊΠΈ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².Β
ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
ΠΡΠ»ΠΈ Π²Ρ Π΄ΠΎΡΠΈΡΠ°Π»ΠΈ Π΄ΠΎ ΡΡΠ΄Π° β ΡΠΎ Π΄Π°Π»ΡΡΠ΅ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠΈΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ΄, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π½Π° GitHub:
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com
