Play рдлреНрд░реЗрдорд╡рд░реНрдХ 2.0 рдкреНрд░рджрд░реНрд╢рди рдорд╛рдкрди
рдореИрдВрдиреЗ
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯрд╛рдЗрдкрд╕реЗрдлрд╝ рд╕реНрдЯреИрдХ 2.0 рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдмрд╛рдд рдХреА рдереА ред рдЙрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рдордВрдЪ рдХреЗ рдПрдХ рдШрдЯрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА -
рдЕрдХреНрдХрд╛ 2.0 рдлреНрд░реЗрдорд╡рд░реНрдХ, рдЬреЛ рдЬреЗрд╡реАрдПрдо рдкрд░ рдЕрднрд┐рдиреЗрддрд╛ рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЖрдЬ рдореИрдВ рдЯрд╛рдЗрдкрд╕реИрдХ рд╕реНрдЯреИрдХ рдХреЗ рдПрдХ рдЕрдиреНрдп рдШрдЯрдХ -
рдкреНрд▓реЗ 2.0 рдврд╛рдВрдЪреЗ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрджреНрдпрдкрд┐ рдЗрд╕ рдШрдЯрдХ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рдпрд╣рд╛рдВ рдФрд░
рдпрд╣рд╛рдВ рдмрддрд╛рдИ рдЧрдИ
рд╣реИ , рдкреНрд▓реЗ 2.0 рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рд╕рдВрдЦреНрдпрд╛ рдХреНрдпрд╛ рд╣реИ? рдЗрди рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рдЦрдкрдд рдХрд┐рддрдиреА рд░реИрдо рд╣реИ? рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреНрд░рддрд┐ рдпреВрдирд┐рдЯ рдХреЗ рдХрд┐рддрдиреЗ рдЕрдиреБрд░реЛрдз рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?
рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди
рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдкреНрд▓реЗ 2.0 рдврд╛рдВрдЪреЗ рдХреА рдореБрдЦреНрдп рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред Play HTTP рд╕рд░реНрд╡рд░ рд╣рд╛рдИ-рдкрд░рдлреЙрд░реНрдореЗрдВрд╕
рдиреЗрдЯреНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдпрд╣ рди рдХреЗрд╡рд▓ рдЖрдкрдХреЛ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд░реНрд╡рд▓реЗрдЯ рдХрдВрдЯреЗрдирд░ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдмрд▓реНрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╢рд╛рд╕реНрддреНрд░реАрдп рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЖрдиреЗ рд╡рд╛рд▓рд╛ рдЕрдиреБрд░реЛрдз, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЧрдгрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рд░ рд╕рдордп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдереНрд░реЗрдб рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрдЧрд╛, рдЬрдмрдХрд┐ рдпрд╣ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред Play рдЖрдкрдХреЛ рдЧрдгрдирд╛ рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкреВрд▓ рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЧрдгрдирд╛ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдо рд▓реЗрддрд╛ рд╣реИред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдЖрд╡реЗрджрди рддреАрди рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛:
- рдХреНрд▓рд╛рдЗрдВрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдПрдВ (
/wait?cid={connection_id}
) - рдЖрдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓реНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдФрд░ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдзреВрдордХреЗрддреБ-рдХрдиреЗрдХреНрд╢рди (
/put?v={value}
) рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдкрд░ рднреЗрдЬреЗрдВ - рд╕рднреА рдореМрдЬреВрджрд╛ рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░реЗрдВ (
/closeall
)
рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдЕрдХреНрдХрд╛ 2.0 рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрдХрд╛рд▓рд╛ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпрд╣ рдЬрд╛рд╡рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдХреНрдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдиреАрдЪреЗ рдореИрдВ рдХреЛрдб рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдкреНрд▓реЗ 2.0 рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рд░рд▓рддрд╛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХрд╛ рд╕рд╛рд░ рдирд╣реАрдВ рдЫреЛрдбрд╝реВрдВрдЧрд╛ред рд╕рднреА рдХреЛрдб рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рд▓рд┐рдВрдХ рдЬреЛ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрднрд┐рдиреЗрддрд╛ рдзреВрдордХреЗрддреБ-рдЕрдк
... lazy val channel: PushEnumerator[String] = ch ... def receive = { case Message(message) => { channel.push(message) } ... case Close => { channel.push("closed") channel.close() self ! Quit } } ...
channel
рдЪрд░ рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди (рдкреНрд░рдХрд╛рд░ -
Enumerator
) рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╣реИ, рдЬрд┐рд╕реЗ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
Comet
-рдХрдиреЗрдХреНрд╢рди (рдкреНрд░рдХрд╛рд░ -
Enumeratee
) рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк
рдпрд╣рд╛рдВ Play рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕реНрд░реЛрддреЛрдВ-рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕-рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдбреЗрдЯрд╛ рдХреЛ
channel.push(message)
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдзреВрдордХреЗрддреБ рд╕реЙрдХреЗрдЯ рдореЗрдВ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
channel.close()
рдХрд╣рдХрд░ рдПрдХ рдзреВрдордХреЗрддреБ рд╕реЙрдХреЗрдЯ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ред
рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рдЕрднрд┐рдиреЗрддрд╛
рдХрдиреЗрдХреНрд╢рдирд╕реБрдкрд░рд╡рд╛рдЗрдЬрд░ рдЕрднрд┐рдиреЗрддрд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдПрдХ рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдирд╛, рдирд┐рд░реНрдорд┐рдд рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛, рд╕рднреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ред
... var connectionActors = Seq.empty[ActorRef] def receive = { case SetConnect(connectionId) => { lazy val channel: PushEnumerator[String] = Enumerator.imperative( onComplete = self ! Disconnect(connectionId) ) val connectionActor = context.actorOf(Props(new ConnectionActor(channel)), connectionId) connectionActors = connectionActors :+ connectionActor sender ! channel } case BroadcastMessage(message) => { connectionActors.foreach(_ ! Message(message)) } case CloseAll => { connectionActors.foreach(_ ! Close) } } ...
рдирд┐рд░реНрдорд┐рдд рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдВрдХ рдХрдиреЗрдХреНрд╢рдирдПрдХреНрдЯрд░ рдЕрдиреБрдХреНрд░рдо (рдкреНрд░рдХрд╛рд░ - Seq [ActorRef]) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬрдм рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЪреИрдирд▓ рдЪреИрдирд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирдП рдХрдиреЗрдХреНрд╢рдирдПрдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдЕрднрд┐рдиреЗрддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрджреЗрд╢ рдХреИрд╕реЗ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реИрдВ рдпрд╣ рдХреЛрдб рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдиреЗрддрд╛
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐
StorageActor
рд▓рд┐рдП рдПрдХ рдореВрд▓реНрдп рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдореВрд▓реНрдп рд╕рднреА рдзреВрдордХреЗрддреБ-рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреА рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирдХрд▓реА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред
... var value = "" def receive = { case Put(v) => { value = v connectSupervisor ! BroadcastMessage(value) sender ! value } } ...
рдЖрд╡реЗрджрди рдирд┐рдпрдВрддреНрд░рдХ
... object Application extends Controller { ... def waitFor(connectionId: String) = Action { implicit val timeout = Timeout(1.second) AsyncResult { (ActorsConfig.connectSupervisor ? (SetConnect(connectionId)) ).mapTo[Enumerator[String]].asPromise.map { chunks => Ok.stream(chunks &> Comet( callback = "console.log")) } } } def broadcastMessage(message: String) = Action { ActorsConfig.connectSupervisor ! BroadcastMessage(message) Ok } def putValueAsync(value: String) = Action { implicit val timeout = Timeout(1.second) Async { (ActorsConfig.storageActor ? Put(value)).mapTo[String].asPromise.map { value => Ok(value) } } } def closeAll = Action { ActorsConfig.connectSupervisor ! CloseAll Ok } }
рдЖрдиреЗ рд╡рд╛рд▓реЗ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкрддреЗ рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдореИрдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдорд╛рд░реНрдЧ рдХрд╛ рд╡рд┐рд╡рд░рдг
conf/routes
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ)ред рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд░реБрдЪрд┐
waitFor
рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдПрдХ рдзреВрдордХреЗрддреБ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ
Enumerator[String]
рдПрдХ рдЪреИрдирд▓ рдХреЛ
waitFor
Enumerator[String]
ред
SetConnect
рд╕рдВрджреЗрд╢ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдЕрднрд┐рдиреЗрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЪреИрдирд▓ рдХреЛ рд╕реЙрдХреЗрдЯ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреИрдирд▓ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ
Comet( callback = "console.log")
рдСрдмреНрдЬреЗрдХреНрдЯ
Comet( callback = "console.log")
рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣
console.log
рдлрд╝рдВрдХреНрд╢рди рд╣реИред
рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░, рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП
iframe
рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
<iframe src='/wait?cid=1' style='display:none'/>
рдкрд░реАрдХреНрд╖рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛
рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ 1 рдЬреАрдмреА рд░реИрдо рдФрд░ 1 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ (рднреМрддрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЗрдВрдЯреЗрд▓ рдХреЛрд░ i5-2400 3.1GHz рд╣реИ) рдХреЗ рд╕рд╛рде Ubuntu 11.10 (32-рдмрд┐рдЯ) рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдЖрднрд╛рд╕реА рдорд╢реАрди рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдорд╛рдирдХ рдЙрдкрдХрд░рдг (JMeter, Visual Studio Load Test) рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд░рд╣рд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ 700 рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рдЧреЛрдВ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдиреЗ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЗрддрдирд╛ рд╡рд┐рд╕реНрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рд░ рдкреИрджрд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛ред рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреИрд╕реЗ рдХрд┐
рдЧреИрдЯрд▓рд┐рдВрдЧ рддрдирд╛рд╡ рдЙрдкрдХрд░рдг (рдЬрд┐рд╕рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рднреА рдЕрдХреНрдХрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ) рдзреВрдордХреЗрддреБ-рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдЙрд╕реА рд╕рдордп, рд╕рдВрд╢реЛрдзрди рднреА рдПрдХ рдХрдард┐рди рдХрд╛рд░реНрдп рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдирд┐рд░реНрдорд╛рдгрд╛рдзреАрди рд╣реИред рдЗрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЯреЗрд╕реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рддреАрди рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ:
- рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рд╣реИ
- рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддреА рд╣реИ
- рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдкреНрд░рддреНрдпреЗрдХ рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рдФрд╕рддрди рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЙрдиреНрд╣реЗрдВ рднреЗрдЬрдиреЗ рдФрд░ рдЙрдирд╕реЗ рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдФрд╕рдд рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдкрд░ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЛрдб рдФрд░ рдЕрдзрд┐рдЧреНрд░рд╣рд┐рдд рд░реИрдо рдХреА рдорд╛рддреНрд░рд╛ рджрд░реНрдЬ рдХреА рдЧрдИ (рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП)ред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо
- рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд░реИрдо рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдорд╛рдкреЗрдВред
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рд╕рдореВрд╣ рдореЗрдВ, рдзреВрдордХреЗрддреБ-рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХрдорд╛рддреНрд░ рдорд╛рди рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ | рдХрдиреЗрдХреНрд╢рди рдЖрд╡реГрддреНрддрд┐ (1 / рдПрдордПрд╕) | рдЕрдзрд┐рдХреГрдд рдореЗрдореЛрд░реА (MB) | рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди рдЕрдзрд┐рдХрддрдо CPU рдЙрдкрдпреЛрдЧ | рдореВрд▓реНрдп рднреЗрдЬрддреЗ рд╕рдордп рдЕрдзрд┐рдХрддрдо CPU рдЙрдкрдпреЛрдЧ |
---|
500 | 50 | 36 | 15% | 15% |
1000 | 40 | 56 | 17.5% | 15% |
3000 | 20 | 145 | 25% | 62% |
3000 | 10 | 142 | 40.6% | 61% |
3000 | 5 | 140 | 59.9% | 70.8% |
3000 | 3 | 138 | 98% | 69% |
6000 | 4 | 262 | 80.5% | 93.4% |
8000 | 4 | 394 | 73.7% | 80.9% |
10000 | 4 | 485 | 77.1% | 100% |
4 рдПрдордПрд╕ рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рдзреВрдордХреЗрддреБ-рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЛрдб рдЙрдЪрд┐рдд рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдиреЗрдХреНрд╢рди рдЬреЛрдбрд╝рдирд╛ рдХреЗрд╡рд▓ рд░реИрдо рдХреА рдмрд╛рдд рд╣реИред
- рдореВрд▓реНрдп рднреЗрдЬрдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рд╢рд┐рдЦрд░ рднрд╛рд░ рдХреЗ рдЕрдзрд┐рдХрддрдо рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдорд╛рдкрдиред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд┐рдЫрд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓реНрдп рднреЗрдЬрдирд╛ рдПрдХ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рд╕рдВрдЪрд╛рд▓рди рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЗрд╕ рд╕рдореВрд╣ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдзрд┐рдХрддрдо рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред
рдзреВрдордХреЗрддреБ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ | рдкреНрд░рд╕реНрддреБрдд рдореВрд▓реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ | рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА рднреЗрдЬреЗрдВ (1 / ms) | рдореИрдХреНрд╕ рд╕реАрдкреАрдпреВ рдпреВрд╕реЗрдЬ рдСрди рд╕рдмрдорд┐рдЯ | рдФрд╕рдд рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп (ms) | рдЕрд╕реНрд╡реАрдХреГрдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ |
---|
1000 | 10 | 100 | 85.7% | 163 | 7 |
1000 | 10 | 500 | 76.5% | 45 | 0 |
1000 | 10 | 200 | 100% | 374 | 2 |
500 | 10 | 200 | 77% | 39 | 0 |
100 | 10 | 100 | 25% | 19 | 0 |
100 | 100 | 50 | 68.9% | 35 | 0 |
100 | 100 | 30 | 100% | 250 | 0 |
10 | 100 | 20 | 31% | 12 | 0 |
10 | 1000 | 10 | 61.7% | 18 | 0 |
10 | 1000 | 5 | 98.7% | 47 | 0 |
1 | 1000 | 4 | 58.2% | 27 | 0 |
1 | 1000 | 2 | 92.3% | 33 | 0 |
1 | 10000 | 2 | 100% | 400 | 4636 |
1 | 8000 | 4 | 100% | 415 | 3217 |
1 | 5000 | 5 | 100% | 399 | 292 |
1 | 3000 | 7 | 100% | 129 | 0 |
1 | 2000 | 7 | 98% | 58 | 0 |
рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 500 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рд╢рд┐рдЦрд░ рднрд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 100-150 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рднрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЕрджреНрдпрддрди:
рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЖрд╡реЗрджрди: git: //github.com/tolyasik/testeeApp.it
рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди: git: //github.com/tolyasik/testerApp.git