рдореИрд╕реЗрдЬрд┐рдВрдЧ -> PubSub OTP рдХреЗ рдЕрдВрджрд░

рдУрдЯреАрдкреА рдХрд╛ рдорддрд▓рдм рдУрдкрди рдЯреЗрд▓рд┐рдХреЙрдо рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИ ; рдЗрд╕рд▓рд┐рдП рдпрд╣ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╣реБрдЖ, рдХреНрдпреЛрдВрдХрд┐ рдордВрдЪ рдЬрд░реВрд░рддреЛрдВ рдФрд░ рдПрд░рд┐рдХреНрд╕рди рдХреЗ рдкреИрд╕реЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рдирд╛рдо рдХреА рдФрд╕рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд╛рд▓реЗ рд╕реЗрдм рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдЕрдиреБрдорд╛рди рд╣реИрдВред


рд▓реЗрдЦрдХреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдУрдЯреАрдкреА рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛, рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рд╣реИред рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдирд╣реАрдВ, рдЕрднрд┐рдиреЗрддрд╛ рдореЙрдбрд▓ рдирд╣реАрдВ, рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреА рд╕рдореГрджреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ, рдкрд╛рд░рджрд░реНрд╢реА рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рднреА рдирд╣реАрдВ рдФрд░ рд╣реЙрдЯ рдХреЛрдб рдЕрдкрдЧреНрд░реЗрдб рдирд╣реАрдВред рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ред


рдПрд░рд▓реИрдВрдЧ рдХреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕рддрд╣реА рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ: рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде "рдкреНрд░реЛрд╕реЗрд╕" (рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрд╕реЗрд╕ рдирд╣реАрдВ, рдПрд░рд▓рд╛рдВрдЧ рдкреНрд░реЛрд╕реЗрд╕) рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рд╕рдм рд╣реИред рдпрд╣рд╛рдБ рдЬреЛ рдЖрд░реНрдорд╕реНрдЯреНрд░рд╛рдВрдЧ рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛ рд╣реИ:


рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рдореИрдВрдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреА рддрд░рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрджреЗрд╢ рдкрд╛рд╕ рдХрд░рдХреЗ рд▓реЛрдЧреЛрдВ рдХреА рдирд┐рдЬреА рдпрд╛рджреЗрдВ рдФрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рд╣реЛрддрд╛ рд╣реИред
- рдореБрдЭреЗ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдкрд╕рдВрдж рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ

рдУрдЯреАрдкреА рдХреЗ рдЕрдВрджрд░ рдореИрд╕реЗрдЬ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреВрд╕рд░реЗ рдХреЛ (рдпрд╛ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣) рд╕рдВрджреЗрд╢ рднреЗрдЬрддреА рд╣реИ, рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпреЗ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпреЗ рдореИрд╕реЗрдЬ рдХрд┐рд╕рдХреЛ рднреЗрдЬрдиреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдкреНрд░реЗрд╖рдХ рд╡рд┐рдирд┐рдордп рдкреНрд░рдмрдВрдзрдХ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рд╕рд╛рд░рдг рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЗрдЪреНрдЫреБрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?


рд╣рд╛рдВ, рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд PubSub рд╣реИ, рд▓реЗрдХрд┐рди OTP рдХреЗ рдмреЙрдХреНрд╕ рдореЗрдВ рд╕реЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЦреИрд░, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдШреБрдЯрдиреЛрдВ рдкрд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдВрдЯреЗ рдореЗрдВ рд╕рднреА рдИрдВрдЯреЗрдВ рд╣реИрдВред рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рдХрд▓реНрдк


рдореВрд▓ рд░реВрдк рд╕реЗ, рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдореЗрдВ рдПрдХ Registry рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕реЗ рдкрдмрд╕реВрдм рдХреЗ рд▓рд┐рдП рдПрдХ рдордЪрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдереЛрдбрд╝рд╛ рд╣реЛрдорд╕реНрдкреВрди рдХреЛрдб, рд╕рднреА рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ (рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ) рдХреЗ рдмрд╛рдж рдПрдХ рд╕рд╛рдл рдирдЬрд╝рд░ рдЖрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ Registry рд╕реНрдерд╛рдиреАрдп рд╣реИ рдФрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рд╡рд┐рддрд░рд┐рдд рд╡рд╛рддрд╛рд╡рд░рдг (рд╡рд┐рддрд░рд┐рдд рдиреЛрдбреНрд╕) рдореЗрдВ рдпрд╣ рд╕реБрдВрджрд░рддрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреАред


Phoenix.PubSub рд╣рдорд╛рд░реЗ рд▓рд┐рдП, Phoenix.PubSub рдХрд╛ рдПрдХ рд╡рд┐рддрд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ рджреЛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ: Phoenix.PubSub.PG2 рдФрд░ Phoenix.PubSub.Redis ред рдареАрдХ рд╣реИ, Redis рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдбрд╝реА рд╣реИ, рд▓реЗрдХрд┐рди PG2 рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ pg2 рд╕рдореВрд╣реЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ PG2 рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрдмрд╕рдм рд╕рджрд╕реНрдпрддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╣реИред рдХреНрдпрд╛ рдкрд╛рда рд╕рдВрдкрд╛рджрдХ рдЦреЛрд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ? "рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред" рдореБрдЭреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рдореИрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


envio


рдЗрд╕ рдкреНрд░рдХрд╛рд░ Envi╠Бo рдкреИрдХреЗрдЬ рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖред рдЪреВрдВрдХрд┐ рдмрдХрд╡рд╛рд╕, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрдХ рдкреИрд╕реЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред


рд╕реНрдерд╛рдиреАрдп рдиреНрдпреВрдЬрд╝рд▓реИрдЯрд░ тЖТ Registry


 defmodule MyApp.Sub do use Envio.Subscriber, channels: [{MyApp.Pub, :main}] def handle_envio(message, state) do # optionally call the default implementation {:noreply, state} = super(message, state) # handle it! IO.inspect({message, state}, label: "Received") # respond with `{:noreply, state}` as by contract {:noreply, state} end end 

рдпрд╣, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рд╣реИред рдпрд╣ MyApp.Sub рдХреЛ рд╣рдорд╛рд░реЗ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рд╡реГрдХреНрд╖ рдореЗрдВ MyApp.Sub рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ MyApp.Pub рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреЗрдЬреЗ рдЧрдП рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ MyApp.Pub , рдЬреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрддрд┐рднрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИред


 defmodule MyApp.Pub do use Envio.Publisher, channel: :main def publish(channel, what), do: broadcast(channel, what) def publish(what), do: broadcast(what) # send to :main end 

рд╡рд┐рддрд░рд┐рдд рдиреНрдпреВрдЬрд╝рд▓реИрдЯрд░ тЖТ PG2


рдХрдИ рдиреЛрдбреНрд╕ рд╡рд╛рд▓реЗ рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреАред рд╣рдореЗрдВ рдЕрдиреНрдп рдиреЛрдбреНрд╕ рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ Registry рдпрд╣рд╛рдВ рд╕рд╣рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди PG2 рд╣реИ рдЬреЛ рд╕рдорд╛рди behaviour рд▓рд╛рдЧреВ рдХрд░рддрд╛ behaviour ред


 defmodule Pg2Sucker do use Envio.Subscriber, channels: ["main"], manager: :phoenix_pub_sub def handle_envio(message, state) do {:noreply, state} = super(message, state) IO.inspect({message, state}, label: "Received") {:noreply, state} end end 

рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХреЛрдб рд╕реЗ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ manager: :phoenix_pub_sub рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрдерд╛рдиреАрдп Registry рдмрдЬрд╛рдп :pg2 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ use Envio.Subscriber (рдФрд░ use Envio.Publisher рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдкрд╛рд╕ рдХрд░рддреЗ use Envio.Subscriber ред рдЕрдм рдЗрд╕ Publisher рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рднреА рдиреЛрдбреНрд╕ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред


рдЖрд╡реЗрджрди


Envi╠Бo рддрдерд╛рдХрдерд┐рдд рдмреИрдХреЗрдВрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред Envio.Slack рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ Envio.Slack рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА - config/prod.exs рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдЪреИрдирд▓ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ - Envi╠Бo рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ:


 config :envio, :backends, %{ Envio.Slack => %{ {MyApp.Pub, :slack} => [ hook_url: {:system, "SLACK_ENVIO_HOOK_URL"} ] } } 

рдЕрдм MyApp.Pub.publish(:slack, %{foo: :bar}) рдХреЙрд▓ рдХрд░рдХреЗ рднреЗрдЬреЗ рдЧрдП рд╕рднреА рд╕рдВрджреЗрд╢ MyApp.Pub.publish(:slack, %{foo: :bar}) рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЪреИрдирд▓ рдкрд░ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рддред рд╕реНрд▓реИрдХ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ Envio.Slack рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ Envio.Slack ред рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, IO рдореЗрдВ рдПрдХ рд▓реЙрдЧ) рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдореИрдВ рдХреНрдпреЛрдВ рдХреНрд░реВрд╕ рдкрд░ рдЪрдврд╝рд╛ рд░рд╣рд╛ рд╣реВрдБ, рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрдорд╛рдПрдБред


 def deps do [ {:envio, "~> 0.8"} ] end 

рдЕрдЪреНрдЫрд╛ рд╕рдВрдЪрд╛рд░!

Source: https://habr.com/ru/post/hi481460/


All Articles