ΠΠ°ΡΠΎ Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π²ΡΠΈΡΠΊΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ°?
ΠΡΠΈ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π·Π° ΡΠ°ΠΉΡΠ° ΠΈΠ»ΠΈ Π±Π΅ΠΊΠ΅Π½Π΄Π°, ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ°Π·ΡΠΌΠ½ΠΈ Ρ ΠΎΡΠ° ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΠΈΠ·Π±Π΅ΡΠ°Ρ SQL Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ.Β
ΠΠΎ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π² Π³Π»Π°Π²Π°ΡΠ° Π²ΡΠ·Π½ΠΈΠΊΠ²Π° ΠΌΠΈΡΡΠ»ΡΠ°, ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΡΡ Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° SQL: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΡΡΡΠ΅Π½Π΅ ΠΈΠ»ΠΈ ΡΠΎΡΠΈΠ°Π»Π½Π° Π³ΡΠ°ΡΠΈΠΊΠ°, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΡΡΡΡΠ΅Π½Π΅ ΠΏΠΎ ΡΠ»ΠΎΠΆΠ½ΠΈ Π²ΡΡΠ·ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅.Β
ΠΠ°ΠΉ-Π»ΠΎΡΠ°ΡΠ° ΡΠΈΡΡΠ°ΡΠΈΡ Π΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Π² Π΅ΠΊΠΈΠΏ ΠΈ ΠΊΠΎΠ»Π΅Π³Π° Π½Π΅ Π·Π½Π°Π΅ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π° Π±ΡΡΠ·ΠΈ Π·Π°ΡΠ²ΠΊΠΈ. ΠΠΎΠ»ΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΡΠ΅ ΠΏΡΠ΅ΠΊΠ°ΡΠ°Π»ΠΈ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ N+1 ΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, Π·Π° Π΄Π° SELECT Π½Π° Π³Π»Π°Π²Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π·Π° ΡΠ°Π·ΡΠΌΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅?
ΠΡΡΠ³ ΠΏΠΎΠΏΡΠ»ΡΡΠ΅Π½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π΅ NoSQL. ΠΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈΠΌΠ°ΡΠ΅ Π³ΠΎΠ»ΡΠΌ ΡΡΠΌ ΠΎΠΊΠΎΠ»ΠΎ ΡΠ°Π·ΠΈ ΡΠ΅ΠΌΠ° - Π·Π° Π²ΡΡΠΊΠ° ΡΠ΄ΠΎΠ±Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ ΡΠ°Π·Π³ΡΡΡΠ°Ρ Π° MongoDB ΠΈ ΡΠ΅ ΡΠ°Π΄Π²Π°Ρ Π° Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° json-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ (ΠΌΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, ΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΎ "ΠΊΠΎΡΡΠΈΠ»ΠΊΠΈ" ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΡΠ»ΠΎΠΆΠΈΡΠ΅ Π·Π°ΡΠ°Π΄ΠΈ ΡΠΈΠΊΠ»ΠΈΡΠ½ΠΈΡΠ΅ Π²ΡΡΠ·ΠΊΠΈ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ΅?).
ΠΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½, Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π΅Π½ Π½Π°ΡΠΈΠ½ - Π·Π°ΡΠΎ Π΄Π° Π½Π΅ ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π²ΡΠΈΡΠΊΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ Π·Π°ΠΏΠ°Π·Π²Π°ΠΉΠΊΠΈ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ (ΡΠ°ΠΉΠ», ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ)?Β
ΠΠ°ΠΌΠ΅ΡΡΠ° ΡΡΠ°Π½Π° Π΅Π²ΡΠΈΠ½Π°, Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΌΠ°Π»ΠΊΠΈ ΠΈ ΡΡΠ΅Π΄Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π²Π»ΠΈΠ·Π°Ρ Π² 1 GB ΠΏΠ°ΠΌΠ΅Ρ. (ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π»ΡΠ±ΠΈΠΌΠΈΡΡ ΠΌΠΈ Π΄ΠΎΠΌΠ°ΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ - , ΠΊΠΎΠΉΡΠΎ Π²ΠΎΠ΄ΠΈ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½Π° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΈ ΠΈΡΡΠΎΡΠΈΡ Π½Π° ΠΌΠΎΠΈΡΠ΅ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈ, Π±Π°Π»Π°Π½ΡΠΈ ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π·Π° Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°ΠΌΠΎ 45 MB ΠΏΠ°ΠΌΠ΅Ρ.)
ΠΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°:
- ΠΠΎΡΡΡΠΏΡΡ Π΄ΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΡΠ°Π²Π° ΠΏΠΎ-Π»Π΅ΡΠ΅Π½ - Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΈΡΠ΅ΡΠ½ΡΠ²Π°ΡΠ΅ Π·Π° Π·Π°ΡΠ²ΠΊΠΈ, Π»Π΅Π½ΠΈΠ²ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅, ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡΠΈ Π½Π° ORM, ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΡΠ°Π²Π° Ρ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ C# ΠΎΠ±Π΅ΠΊΡΠΈ;
- ΠΡΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½ΠΈΡΠΊΠΈ;
- ΠΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ·ΠΎ - Π½ΡΠΌΠ° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ Π·Π°ΡΠ²ΠΊΠΈ, ΠΎΡΡΡΡΡΠ²Π° ΡΡΠ°Π½ΡΠ»Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ΄Π° ΠΊΡΠΌ Π΅Π·ΠΈΠΊ Π·Π° Π·Π°ΡΠ²ΠΊΠΈ, Π½Π΅ Π΅ Π½ΡΠΆΠ½Π° (Π΄Π΅)ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ;
- ΠΠΎΠΏΡΡΡΠΈΠΌΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄ Π²ΡΡΠΊΠ°ΠΊΠ²Π° ΡΠΎΡΠΌΠ° - Π±ΠΈΠ»ΠΎ Π² XML Π½Π° Π΄ΠΈΡΠΊΠ°, Π±ΠΈΠ»ΠΎ Π² SQL Server, Π±ΠΈΠ»ΠΎ Π² Azure Table Storage.
ΠΠΈΠ½ΡΡΠΈ:
- ΠΠ°Π³ΡΠ±Π° Π½Π° Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Π½ΡΠ»Π΅Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΏΡΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅;
- ΠΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠ°Π΄Π½Π΅ - ΠΌΠΎΠΆΠ΅ ΡΠ°ΡΡΠΈΡΠ½ΠΎ Π΄Π° Π·Π°Π³ΡΠ±ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ. (ΠΠΎ Π½Π°Π»ΠΈ Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ ΠΏΠ°Π΄Π°, Π½Π°Π»ΠΈ?)
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ ΡΠΎΠ²Π°?
ΠΠ»Π³ΠΎΡΠΈΡΡΠΌΡΡ Π΅ ΡΠ»Π΅Π΄Π½ΠΈΡΡ:
- ΠΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° Π²ΡΡΠ·ΠΊΠ° Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅;
- ΠΠ·Π³ΡΠ°ΠΆΠ΄Π° ΡΠ΅ ΠΎΠ±Π΅ΠΊΡΠ΅Π½ ΠΌΠΎΠ΄Π΅Π», ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π½Π° ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ (1:1, 1:ΠΠ½ΠΎΠ³ΠΎ);
- Π‘ΡΠ·Π΄Π°Π²Π° ΡΠ΅ Π°Π±ΠΎΠ½Π°ΠΌΠ΅Π½Ρ Π·Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅ (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:ΠΠ½ΠΎΠ³ΠΎ
public IEnumerable Children => Multiple(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(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();
var myParent = parents.Find(newParent.Id);
Assert.IsTrue(ReferenceEquals(myParent, newParent));ΠΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ? Set() Π²ΡΡΡΠ° TableDictionary, ΠΊΠΎΠΉΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° ConcurrentDictionary ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» Π·Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΠΈ Π²ΡΠΎΡΠΈΡΠ½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ. Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΡΡΡΡΠ΅Π½Π΅ ΠΏΠΎ Id (ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ) Π±Π΅Π· Π΄Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠ»Π½ΠΎ ΠΏΡΠ΅Π³Π»Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ.
ΠΡΠΈ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ Π² ObjectRepository ΡΠ΅ Π΄ΠΎΠ±Π°Π²Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π·Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π° ΡΠ΅Ρ
Π½ΠΈΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΡΡΠΊΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ° ΡΡΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΠΎΠ±Π΅ΠΊΡ Π² ΠΎΠΏΠ°ΡΠΊΠ°ΡΠ° Π·Π° Π·Π°ΠΏΠΈΡ.Β
ΠΠ±Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ° ΠΎΡΠ²ΡΠ½ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ POCO ΠΎΠ±Π΅ΠΊΡ:
myParent.Children.First().Property = "Updated value";ΠΠ±Π΅ΠΊΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π°Ρ ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π½Π°ΡΠΈΠ½ΠΈ:
repository.Remove(myParent);
repository.RemoveRange(otherParents);
repository.Remove(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 ΠΎΡΠΊΡΠΈΡΠΈΠ΅? master/slave?)
- ΠΠ° ΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈΡΠ΅ EventLog ΡΡΠ΅Π· ΠΊΠΎΠΉΡΠΎ ΠΈ Π΄Π° Π΅ ΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ RAFT.
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΈ ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΠΉΡΠΎ ΠΌΠ΅ ΠΏΡΠΈΡΠ΅ΡΠ½ΡΠ²Π° β ΠΊΠ°ΡΠΊΠ°Π΄Π½ΠΎΡΠΎ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅, ΠΈΠ»ΠΈ ΠΎΡΠΊΡΠΈΡΠΈΠ΅ Π½Π° ΡΠ»ΡΡΠ°ΠΈ Π½Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ, Π½Π° ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ° ΠΏΡΠ΅ΠΏΡΠ°ΡΠΊΠΈ ΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ.Β
ΠΠ·Ρ ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄
ΠΠΊΠΎ ΡΡΠ΅ ΠΏΡΠΎΡΠ΅Π»ΠΈ Π΄ΠΎ ΡΡΠΊ β ΠΎΡΡΠ°Π½Π°Π»ΠΎΡΠΎ Π΅ ΡΠ°ΠΌΠΎ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° GitHub:
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
