рд╣реЗрд▓реЛ, рд╣реЗрдмрд░ рдХреЗ рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВред рдореЗрд░рд╛ рдирд╛рдо рд░реБрд╕реНрддрдо рд╣реИ рдФрд░ рдореИрдВ рдХрдЬрд╝рд╛рдХрд┐рд╕реНрддрд╛рди рдХреА рдХрдВрдкрдиреА рдбреАрдПрдЖрд░ рдореЗрдВ рдореБрдЦреНрдп рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЕрдХрд╛рдВрдХреНрд╖рд╛ рдЯреВрд▓рдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╡реЗрдВрдЯ рд╕реЛрд░реНрд╕рд┐рдВрдЧ рдФрд░ CQRS рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдПред
2015 рдХреЗ рдЖрд╕рдкрд╛рд╕, рд╣рдордиреЗ рдЕрдкрдирд╛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╕реНрдХрд╛рд▓рд╛ рдФрд░ рдЕрдХреНрдХрд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдордиреЗ рдЕрдХреНрдХрд╛ рдЯреВрд▓рдХрд┐рдЯ рдкрд░ рд░реБрдХрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ CQRS рдХреЗ рд╕рд╛рде рдЗрд╡реЗрдВрдЯ рд╕реЛрд░реНрд╕рд┐рдВрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рд╕рдлрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдерд╛ рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рд╕рдВрдЪрдп, рдЬрд┐рд╕реЗ рдореИрдВ рдкрд╛рдардХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЕрдХреНрдХрд╛ рдЗрди рдкреИрдЯрд░реНрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреМрди рд╕реЗ рдЙрдкрдХрд░рдг рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдФрд░ рдЕрдХреНрдХрд╛ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдХреНрдХрд╛ рдЯреВрд▓рдХрд┐рдЯ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭ рд╣реЛрдЧреАред
CQRS рдФрд░ рдЗрд╡реЗрдВрдЯ рд╕реЛрд░реНрд╕рд┐рдВрдЧ рдХреЗ рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рд╣реИрдмреЗ рдФрд░ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдХрдИ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рдЧрдП рдереЗред рдпрд╣ рд▓реЗрдЦ рдЙрди рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ CQRS рдФрд░ Event Sourcing рдХреНрдпрд╛ рд╣реИрдВред рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдХреНрдХрд╛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдбреЛрдореЗрди рд╕рдВрдЪрд╛рд▓рд┐рдд рдбрд┐рдЬрд╛рдЗрди
Domain-Driven Design (DDD) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рд╛рдордЧреНрд░реА рд▓рд┐рдЦреА рдЧрдИ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╡рд┐рд░реЛрдзреА рдФрд░ рд╕рдорд░реНрдердХ рджреЛрдиреЛрдВ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╡реЗрдВрдЯ рд╕реЛрд░реНрд╕рд┐рдВрдЧ рдФрд░ рд╕реАрдХреНрдпреВрдЖрд░рдПрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдбреАрдбреАрдбреА рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреАрдбреАрдбреА рджрд░реНрд╢рди рд╕рднреА рдЕрдХреНрдХрд╛ рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╡реЗрдВрдЯ рд╕реЛрд░реНрд╕рд┐рдВрдЧ рдФрд░ CQRS рдбреЛрдореЗрди-рдбреНрд░рд┐рд╡реЗрди рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╛рдордХ рдмрдбрд╝реА рддрд╕реНрд╡реАрд░ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рдбрд┐рдЬрд╛рдЗрди рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрди рдЯреЗрдореНрдкреНрд▓реЗрдЯреЛрдВ рдХреЛ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдкреНрд░рд╢реНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдбреАрдбреАрдбреА рдХреЛ рдЬрд╛рдирдиреЗ рд╕реЗ рдЖрдкрдХрд╛ рдЬреАрд╡рди рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдЕрдиреБрдЪреНрдЫреЗрдж рдореЗрдВ, рд╢рдмреНрдж рдЗрдХрд╛рдИ (DDD рджреНрд╡рд╛рд░рд╛ рдЗрдХрд╛рдИ) рдХрд╛ рдЕрд░реНрде рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рдЕрднрд┐рдиреЗрддрд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛрдЧрд╛ред
рд╕реНрдХрд╛рд▓рд╛ рдХреНрдпреЛрдВ?
рд╣рдорд╕реЗ рдЕрдХреНрд╕рд░ рдкреВрдЫрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХрд╛рд▓рд╛, рдФрд░ рдЬрд╛рд╡рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВред рдПрдХ рдХрд╛рд░рдг рдЕрдХреНрдХрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╕реНрдХрд╛рд▓рд╛ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХред рдпрд╣рд╛рдБ рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ .NET рдкрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдиреНрдп рд╡рд┐рд╖рдп рд╣реИред рдЪрд░реНрдЪрд╛ рдХрд╛ рдХрд╛рд░рдг рди рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рдЬрд╛рд╡рд╛ рд╕реЗ рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреНрдпреЛрдВ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдмрддрд╛рдКрдВрдЧрд╛, рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЕрдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╕реНрдХрд╛рд▓рд╛ рдХреЛ рдЬрд╛рд╡рд╛ рдкрд░ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИ:
- рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБрдПрдБред рдЬрд╛рд╡рд╛ рдореЗрдВ, рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рд╕реНрдХрд╛рд▓рд╛
case class
рдкрд╣рд▓реЗ рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд copy
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ - рдХреЛрдбрд┐рдВрдЧ рд╢реИрд▓реАред рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░, рдЖрдк рдЕрднреА рднреА рд╕реНрдХреЗрд▓ рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗред
рдпрд╣рд╛рдБ рд╕реНрдХрд╛рд▓рд╛ рдФрд░ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЕрднрд┐рдиреЗрддрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
рд╕реНрдХреЗрд▓рд╛:
object DemoActor { def props(magicNumber: Int): Props = Props(new DemoActor(magicNumber)) } class DemoActor(magicNumber: Int) extends Actor { def receive = { case x: Int => sender() ! (x + magicNumber) } } class SomeOtherActor extends Actor { context.actorOf(DemoActor.props(42), "demo")
рдЬрд╛рд╡рд╛:
static class DemoActor extends AbstractActor { static Props props(Integer magicNumber) { return Props.create(DemoActor.class, () -> new DemoActor(magicNumber)); } private final Integer magicNumber; public DemoActor(Integer magicNumber) { this.magicNumber = magicNumber; } @Override public Receive createReceive() { return receiveBuilder() .match( Integer.class, i -> { getSender().tell(i + magicNumber, getSelf()); }) .build(); } } static class SomeOtherActor extends AbstractActor { ActorRef demoActor = getContext().actorOf(DemoActor.props(42), "demo");
( рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг)
Java рднрд╛рд╖рд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ createReceive()
рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, ReceiveBuilder
рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред receiveBuilder()
рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЬрд╛рд╡рд╛ рдореЗрдВ рдкреИрдЯрд░реНрди-рдореИрдЪрд┐рдВрдЧ рд╣реИред рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ, рдЗрд╕реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╣рдордд рд╣реВрдБ, рд╕реНрдХрд╛рд▓рд╛ рдХрд╛ рдХреЛрдб рдЫреЛрдЯрд╛ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред
- рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдЙрджрд╛рд╣рд░рдгред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдЬрд╛рд╡рд╛, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рд▓рдЧрднрдЧ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдЕрдХреНрдХрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдХрд╛рд▓рд╛ рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдЬреЗрд╡реАрдПрдо рдореЗрдВ рдШреВрдорддрд╛ рд╣реИред
рдХреЛрд╖
рдПрдХреНрдХрд╛ рдкрд░реНрд╕рд┐рд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде рдЗрд╡реЗрдВрдЯ рд╕реЛрд░реНрд╕рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЖрдзрд╛рд░ рдХреА рдкрд╕рдВрдж рдЖрдкрдХреА рдЗрдЪреНрдЫрд╛рдУрдВ рдФрд░ рд╡рд░реАрдпрддрд╛рдУрдВ рдкрд░, рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдбреЗрдЯрд╛ рдХреЛ NoSQL рдФрд░ RDBMS, рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Google рд╕реЗ LevelDBред
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрдХрд╛ рджреГрдврд╝рддрд╛ рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдХреНрдХрд╛ рдкрд░реНрд╕рд┐рд╕реНрдЯреЗрдВрд╕ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╕реВрдЪреА рд╕реЗ рдПрдХ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк, рдореИрдВ рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдкрд╣рд┐рдпрд╛ рдХреЛ рдХреНрдпреЛрдВ рдордЬрдмреВрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдХреИрд╕рдВрдбреНрд░рд╛ рдореЗрдВ рд░рд╣рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп, рддреЗрдЬ рдФрд░ рд╡рд┐рддрд░рд┐рдд рдЖрдзрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯрд╛рдЗрдкрд╕реЗрдлрд╝ рдЦреБрдж рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдХреНрдХрд╛ рдкрд░реНрд╕рд┐рд╕реНрдЯреЗрдВрд╕ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ ред рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдХреИрд╕реЗрдВрдбреНрд░рд╛ рдкреНрд▓рдЧрдЗрди рдиреЗ рдЕрдзрд┐рдХ рдкреВрд░реНрдг рдкреНрд░рд▓реЗрдЦрди рд▓рд┐рдЦрд╛ рд╣реИред
рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рднреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрднреА рднреА рдХреЛрдИ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИ (рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг 0.97 рд╣реИ)ред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдордиреЗ рдЬреЛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЙрдкрджреНрд░рд╡ рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ рдХреБрдЫ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рд╢реНрди рдкрдврд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдиреБрдХрд╕рд╛рди рдерд╛ред рдПрдХ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ CQRS рдЪрд╛рд░реНрдЯ рд╣реИ:

рд▓рдЧрд╛рддрд╛рд░ рдЗрдХрд╛рдИ рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреИрдЧ рдореЗрдВ рдЗрдХрд╛рдИ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 10 рд╢рд╛рд░реНрдХ):

рдлрд┐рд░, Persistent Query рдЗрди рдЯреИрдЧреНрд╕ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдЯреНрд░реАрдо рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ рдЬреЛ Elastic Search рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдХреИрд╕рдВрдбреНрд░рд╛ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдХреЛ рдиреЛрдбреНрд╕ рдореЗрдВ рдмрд┐рдЦреЗрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреБрдЫ рдиреЛрдбреНрд╕ рд╢рд┐рдерд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рд╕рдЦреНрдд рдХреНрд░рдо рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд▓рдЧрдЗрди рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдЧрд░ рдЙрд╕реЗ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдШрдЯрдирд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, entity-A event NR 2
, рддреЛ рдпрд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╕ рдЗрд╕ рдЗрдХрд╛рдИ рдХреА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрдЧрд╛ред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рднреА, рдЧрдЯрд░ рдкрд░ рдЪрд░реНрдЪрд╛ рд╣реБрдИред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдЖрдк @kotdv рдФрд░ рдкреНрд▓рдЧрдЗрди рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: Gitter
рдЗрд╕ рдЧрд▓рддрдлрд╣рдореА рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдЖрдкрдХреЛ рдкреНрд▓рдЧрдЗрди рдХреЛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдЯрд╛рдЗрдкрд╕реЗрдлрд╝ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЕрдВрддрддрдГ рд╕рдВрдЧрддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рд╣рдо рдЕрднреА рднреА рдПрдХ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
- рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИрдВред рдЖрдк рдкреНрд▓рдЧрдЗрди рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП
assandra-query-journal.events-by-tag.eventual-consistency.delay=10s
рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╕реАрдорд╛ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: c assandra-query-journal.events-by-tag.eventual-consistency.delay=10s
- рдбреЗрдЯрд╛рд╕реНрдЯреИрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХреИрд╕реЗрдВрдбреНрд░рд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ G1 рд░рдЦреЛ рдФрд░ Cassandra рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВред
рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рд▓рд╛рдкрддрд╛ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдм рджреГрдврд╝рддрд╛ рдХреНрд╡реЗрд░реА рдкрдХреНрд╖ (рдкрд╛рдВрдЪ рд╕реЗ рджрд╕ рд╕реЗрдХрдВрдб рд╕реЗ) рдкрд░ рдПрдХ рд╕реНрдерд┐рд░ рдбреЗрдЯрд╛ рджреЗрд░реА рд╣реИред рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЬрд╣рд╛рдВ рдЧрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрд╕ рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдкреНрд░рдХрд╛рд╢рди рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рддрдВрддреНрд░ рдЪреБрдирдирд╛ рд╣реИ: рдХрдо рд╕реЗ рдХрдо-рдПрдХ рдмрд╛рд░ рдпрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ-рдПрдХ рдмрд╛рд░ред рдЕрдХреНрдХрд╛ рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд░реНрдгрди рдпрд╣рд╛рдБ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдПрдХ рд╕рдВрдХреНрд░рдордг рд░рд╛рдЬреНрдп рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдЬреЛ рдмрд╕ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рдлрд▓ рдкреНрд░рдХрд╛рд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирдореВрдирд╛ рдХреЛрдб рд╣реИ:
object SomeEntity { sealed trait Event { def uuid: String } case class DidSomething(uuid: String) extends Event /** * , . */ case class LastEventPublished(uuid: String) extends Event /** * , . * @param unpublishedEvents тАУ , . */ case class State(unpublishedEvents: Seq[Event]) object State { def updated(event: Event): State = event match { case evt: DidSomething => copy( unpublishedEvents = unpublishedEvents :+ evt ) case evt: LastEventPublished => copy( unpublishedEvents = unpublishedEvents.filter(_.uuid != evt.uuid) ) } } } class SomeEntity extends PersistentActor { тАж persist(newEvent) { evt => updateState(evt) publishToEventBus(evt) } тАж }
рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдШрдЯрдирд╛ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рддреЛ SomeEntity
рдХреА рдЕрдЧрд▓реА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ DidSomething
рдШрдЯрдирд╛ рдмрд╕ рддрдХ рдирд╣реАрдВ DidSomething
рдФрд░ рдлрд┐рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧреАред
serializer
рдЕрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ - рдЕрдХреНрдХрд╛ рд╕реАрд░рд┐рдпрд▓рд▓рд╛рдЗрдЬрд╝реЗрд╢рди ред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдЙрдиреНрд╣реЗрдВ Persistence API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬрд╛рд╡рд╛ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ Java Serializer рдзреАрдорд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИред рджреЛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдорд╛рдзрд╛рди рд╣реИрдВ - рдпреЗ JSON рдФрд░ Protobuf рд╣реИрдВред JSON, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдзреАрдореА рд╣реИ, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХреНрд░рдорд╛рдВрдХрди рдФрд░ рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдкрд░ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдзреАрдореА рд╣реЛ рдЬрд╛рдПрдЧреАред рдбреЛрдореЗрди рдореЙрдбрд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдПрдХ рдФрд░ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдбреЗрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред рдбреЛрдореЗрди рдореЙрдбрд▓ рдФрд░ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рдмреАрдЪ рд▓рдЧрд╛рддрд╛рд░ рдореИрдкрд┐рдВрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВред

рдПрдХ рдирдпрд╛ рдИрд╡реЗрдВрдЯ рдЬреЛрдбрд╝рд╛ - рдореИрдкрд┐рдВрдЧ рд▓рд┐рдЦреЗрдВред рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди - рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦреЗрдВ рдФрд░ рдореИрдкрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓реЗрдВред рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмрд╣реБрдд рдХрд╛рдо рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рд╢рд┐рдерд┐рд▓ рдпреБрдЧреНрдорд┐рдд рдШрдЯрдХ рдорд┐рд▓реЗрдВрдЧреЗред
рдирд┐рд╖реНрдХрд░реНрд╖
- рдзреНрдпрд╛рди рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЖрдзрд╛рд░ рдФрд░ рдкреНрд▓рдЧрдЗрди рдЪреБрдиреЗрдВред рдореИрдВ рдПрдХ рдкреНрд▓рдЧрдЗрди рдЪреБрдирдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ред рдХреНрд╖реЗрддреНрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдпрд╛ рд╣реИ, рдЕрднреА рднреА рдХреБрдЫ рдЦрд╛рдорд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдЕрднреА рддрдХ рд╣рд▓ рдирд╣реАрдВ рд╣реБрдИ рд╣реИрдВ
- рдпрджрд┐ рдЖрдк рд╡рд┐рддрд░рд┐рдд рд╕рдВрдЧреНрд░рд╣рдг рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ 10 рд╕реЗрдХрдВрдб рддрдХ рдХреА рджреЗрд░реА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рдЦрдирд╛ рд╣реЛрдЧрд╛
- рдХреНрд░рдордмрджреНрдзрддрд╛ рдХреА рдЬрдЯрд┐рд▓рддрд╛ред рдЖрдк рдЧрддрд┐ рдХреЛ рддреНрдпрд╛рдЧ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ JSON рдкрд░ рд░реБрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдПрдбреЗрдкреНрдЯрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдкреНрд▓рд╕рд╕ рд╣реИрдВ, рдпреЗ рд╢рд┐рдерд┐рд▓ рдпреБрдЧреНрдорд┐рдд рдШрдЯрдХ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд╡рд┐рдХрд╛рд╕ рджрд▓ рд╣реИрдВ рдЬреЛ рдПрдХ рдмрдбрд╝реА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред