рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдЯреЛрд░ рдХреА рд╕реНрдерд┐рддрд┐

рд╕рдм рдХреБрдЫ рдирдпрд╛ рдкреБрд░рд╛рдирд╛ рднреВрд▓ рдЧрдпрд╛ рд╣реИ!

рдЕрдм рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдмреЙрдЯ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдИрдПрдо рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓рд╛рдЗрд╡ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред



рдпрджрд┐ рдЖрдк рдХрдИ рдмреЙрдЯреНрд╕ рдХрд╛ рдХреЛрдб рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЙрд╕реА рдкреИрдЯрд░реНрди рдкрд░ рдЖрддрд╛ рд╣реИ:


  • рд╕рдВрджреЗрд╢ рдЖрддрд╛ рд╣реИ
  • рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ ( callback ) рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

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


рдЖрдЗрдП рдЗрд╕реЗ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред


рдореИрдВ рдЕрд╕реНрд╡реАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛:


  1. рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдЬреЛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдмреЙрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ <-> ред
  2. рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдХреЛрдб рдПрдХ рд╕реНрдХреЗрдЪ рдХреЛрдб рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ 15 рдорд┐рдирдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ред рдЗрд╕рд▓рд┐рдП рдХрдбрд╝рд╛рдИ рд╕реЗ рдиреНрдпрд╛рдп рди рдХрд░реЗрдВред
  3. рдореИрдВрдиреЗ рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: рд▓реЛрдб рд╕рдВрддреБрд▓рди рдХреЗ рд╕рд╛рдеред рд▓реЗрдХрд┐рди, рдЕрдлрд╕реЛрд╕, рдореЗрд░реЗ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмреБрдирд┐рдпрд╛рджреА рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рд╕реНрдХреЗрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдкреНрд░рддрд┐рдорд╛рди рд╡рд┐рдХрд╛рд╕ рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рд╕рдВрдкрд░реНрдХ рдХрд░реВрдВрдЧрд╛ (рдореИрдВ рдпрд╣ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдХрд╣рд╛рдВ рдФрд░ рдХреИрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдП рд╣реИрдВ)ред

рдЕрдЪреНрдЫрд╛, рдЕрдм рдЪрд▓реЛред


рд╕рдорд░реНрдерди рдХреЗ рд░реВрдк рдореЗрдВ, aiogram рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп , python3.7 + рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд▓рд┐рдВрдХ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЗрдХреЛ рдмреЙрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред


рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдХреЙрдкреА рдХрд░реВрдВрдЧрд╛:


рдХреЛрдб рджреЗрдЦреЗрдВ
 """ This is a echo bot. It echoes any incoming text messages. """ import logging from aiogram import Bot, Dispatcher, executor, types API_TOKEN = 'BOT TOKEN HERE' # Configure logging logging.basicConfig(level=logging.INFO) # Initialize bot and dispatcher bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) @dp.message_handler(regexp='(^cat[s]?$|puss)') async def cats(message: types.Message): with open('data/cats.jpg', 'rb') as photo: ''' # Old fashioned way: await bot.send_photo( message.chat.id, photo, caption='Cats are here ', reply_to_message_id=message.message_id, ) ''' await message.reply_photo(photo, caption='Cats are here ') @dp.message_handler() async def echo(message: types.Message): # old style: # await bot.send_message(message.chat.id, message.text) await message.answer(message.text) if __name__ == '__main__': executor.start_polling(dp, skip_updates=True) 

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдмреЙрдЯ рдХрд╛ рд╕рдВрдЧрдарди рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╣реИред рдЬрдм рднреА рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдПрдХ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд▓рд╛рддрд╛ рд╣реИред


рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ рдЗрд╕ рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рд╕рд╛рде?


рдЬрдЯрд┐рд▓ рд╕рдВрд╡рд╛рджреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдХрд╛рд░реНрдп рдЕрдкрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдкрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рднрдВрдбрд╛рд░рдг рд╕реЗ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреЙрдЯреНрд╕ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реНрдпрд╡рд╕рд╛рдп рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рдо рдкрд░ рд░рдЦрдиреЗ), рддреЛ рд╡реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ 1..N рдкреНрд░рд╢реНрди рдкреВрдЫрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЗрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ)ред


рдпрджрд┐ рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╢реИрд▓реА (рдПрдХ рд░рд┐рдВрдЧ рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рдмрдЬрд╛рдп) рдореЗрдВ рдПрдХ рдмреЙрдЯ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рдерд╛, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рд╕реНрдЯреИрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред


рдЪрд▓реЛ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред


рдореИрдВрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдПрдХ рд╕реНрдХреЗрдЪ рдХреЛ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


рдХреЛрдб рджреЗрдЦреЗрдВ
 #  - chat_dispatcher.py import asyncio class ChatDispatcher: class Timeout(RuntimeError): def __init__(self, last_message): self.last_message = last_message super().__init__('timeout exceeded') def __init__(self, *, chatcb, shardcb = lambda message: message.from_user.id, inactive_timeout = 15 * 60): self.chatcb = chatcb self.shardcb = shardcb self.inactive_timeout = inactive_timeout self.chats = {} async def handle(self, message): shard = self.shardcb(message) loop = asyncio.get_event_loop() if shard not in self.chats: self.chats[shard] = { 'task': self.create_chat(loop, shard), 'messages': [], 'wait': asyncio.Event(), 'last_message': None, } self.chats[shard]['messages'].append(message) self.chats[shard]['wait'].set() def create_chat(self, loop, shard): async def _chat_wrapper(): try: await self.chatcb(self.get_message(shard)) finally: del self.chats[shard] return loop.create_task(_chat_wrapper()) def get_message(self, shard): async def _get_message(inactive_timeout=self.inactive_timeout): while True: if self.chats[shard]['messages']: last_message = self.chats[shard]['messages'].pop(0) self.chats[shard]['last_message'] = last_message return last_message try: await asyncio.wait_for(self.chats[shard]['wait'].wait(), timeout=inactive_timeout) except asyncio.TimeoutError: self.chats[shard]['wait'].set() raise self.Timeout(self.chats[shard]['last_message']) if not self.chats[shard]['messages']: self.chats[shard]['wait'].clear() return _get_message 

рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:


ChatDispatcher рд╡рд░реНрдЧ рдирд┐рдореНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде ChatDispatcher рд╣реИ:


  1. рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рддреЗрдЬ рдХрд░рдирд╛ (рдЗрд╕реЗ рд╢рд╛рд░реНрдбрд┐рдВрдЧ рдХреНрдпреЛрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдмрд╛рдж рдореЗрдВ, рдЬрдм рд╣рдо рдмрдбрд╝реЗ рднрд╛рд░ рдкрд░ рд╕реНрдкрд░реНрд╢ рдХрд░рддреЗ рд╣реИрдВ)ред рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рдВрд╡рд╛рдж рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред
  2. рдРрд╕реЗ рдХрд╛рд░реНрдп рдЬреЛ рдЪреИрдЯ рд╕реЗрд╡рд╛ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗред
  3. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдордЖрдЙрдЯ рдорд╛рдиред

рдиреМрдХрд░реА рдХрд╛ рд╡рд┐рд╡рд░рдг:


  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрджреЗрд╢ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ, рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрд╡рд╛рдж рдХрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрд╣ рдХрд╛рд░реНрдп рддрдм рддрдХ рдЪрд▓реЗрдЧрд╛ рдЬрдм рддрдХ рд╕рдВрд╡рд╛рдж рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред
  2. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред echo рдЪреИрдЯ рдЙрджрд╛рд╣рд░рдг:
     async def chat(get_message): message = await get_message() await message.answer(message.text) 
  3. рд╣рдо рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ ( message.answer )ред

рдЖрдЗрдП рдЗрд╕ рдкреНрд░рддрд┐рдорд╛рди рдореЗрдВ рдПрдХ рдмреЙрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ


рдкреВрд░реНрдг рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ
 #  bot.py import asyncio import re from .chat_dispatcher import ChatDispatcher import logging from aiogram import Bot, Dispatcher, executor, types API_TOKEN ='    ' logging.basicConfig(level=logging.INFO) bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) async def chat(get_message): try: message = await get_message() await message.answer('  ,   ') first = await get_message() if not re.match('^\d+$', str(first.text)): await first.answer('  ,  : /start') return await first.answer('  ') second = await get_message() if not re.match('^\d+$', str(second.text)): await second.answer('  ,  : /start') return result = int(first.text) + int(second.text) await second.answer(' %s (/start - )' % result) except ChatDispatcher.Timeout as te: await te.last_message.answer('-   ,  ') await te.last_message.answer(' - /start') chat_dispatcher = ChatDispatcher(chatcb=chat, inactive_timeout=20) @dp.message_handler() async def message_handle(message: types.Message): await chat_dispatcher.handle(message) if __name__ == '__main__': executor.start_polling(dp, skip_updates=True) 

рдПрдХ рд▓рд┐рдЦрд┐рдд рдмреЙрдЯ рдЙрджрд╛рд╣рд░рдг - рдпрд╣ рдмрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред


рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рдЦреИрд░, рдЕрдм рдХреЛрдб рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╣рдорд╛рд░реЗ рд╕реНрдХреЗрдЪ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдорд╛рдирдХ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо await chat_dispatcher.handle(message) ред рдФрд░ рд╣рдордиреЗ chat рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ chat рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛, рдореИрдВ рдЗрд╕рдХрд╛ рдХреЛрдб рдпрд╣рд╛рдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛:


 async def chat(get_message): try: message = await get_message() await message.answer('  ,   ') first = await get_message() if not re.match('^\d+$', str(first.text)): await first.answer('  ,  : /start') return await first.answer('  ') second = await get_message() if not re.match('^\d+$', str(second.text)): await second.answer('  ,  : /start') return result = int(first.text) + int(second.text) await second.answer(' %s (/start - )' % result) except ChatDispatcher.Timeout as te: await te.last_message.answer('-   ,  ') await te.last_message.answer(' - /start') 

рдЪреИрдЯ рд╕реЗрд╡рд╛ рдХреЛрдб - рдмрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдорд╛рдВрдЧрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдкрд░ рдЦрдбрд╝реА рд╣реЛрддреА рд╣реИрдВ (рдЪрд░ first , second , message )ред


get_message рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрдЯ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рднреА рджрд░реНрдЬ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдЖрдк рдЙрд╕реА рд╕рдордп рдореЗрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред


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


рдХрдорд┐рдпреЛрдВ


рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХрд╣рд╛рдБред


  1. рдкреНрд░рддреНрдпреЗрдХ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛рд░реНрдп-рдХреЛрд░реБрдЯрд┐рди рд╣реИред рдФрд╕рддрди, рдПрдХ рд╕реАрдкреАрдпреВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓рдЧрднрдЧ 1000 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реЗрд╡рд╛ рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рджреЗрд░реА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред
  2. рдкреВрд░реЗ рдбреЗрдореЙрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ - рд╕рднреА рд╕рдВрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ)ред
  3. рдХреЛрдб [рдЙрджрд╛рд╣рд░рдг рд╕реЗ] рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдФрд░ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ: рд╕реНрдЯреЙрдк рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░реЗрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрддрд╛рдПрдВ "рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдПрдХ рдЖрдкрд╛рддрдХрд╛рд▓реАрди рд╕реНрдерд┐рддрд┐ рд╣реИ, рдЖрдЧ, рдореИрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╡рд╛рдкрд╕ рдЖрдКрдВрдЧрд╛ред" рд╡рд╣ рдЖрдЦрд┐рд░реА рд╕рдорд╕реНрдпрд╛ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВ:


рд▓реЛрдб рд╕реНрдХреЗрд▓рд┐рдВрдЧ


рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд▓реЛрдб рдХрд┐рдП рдЧрдП рдмреЙрдЯ рдХреЛ рдПрдХ рд╕рд╛рде рдХрдИ рдмреИрдХреЗрдВрдб рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рддрджрдиреБрд╕рд╛рд░, рдСрдкрд░реЗрд╢рди рдХреЗ webHook рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


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


рд╣рдордиреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ред


  1. рдмреИрд▓реЗрдВрд╕рд░ рдкрд░, рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢ ( message ) рдХреЗ JSON рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ
  2. рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рдпреВрдЬрд░ рдЖрдИрдбреА рдЪреБрдиреЗрдВ
  3. рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдмреИрдХрдПрдВрдб рдирдВрдмрд░ (== рд╢рд╛рд░реНрдж) рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, user_id % Nshards рдХрд╛ рдЙрдкрдпреЛрдЧ user_id % Nshards ред
  4. рд╣рдо рд╢рд╛рд░реНрдХ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

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


рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдмреИрд▓реЗрдВрд╕рд░ рдХрд╛ рдХреЛрдб рд╕рд░рд▓ рд╣реИ - рдпрд╣ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ 10 рдорд┐рдирдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдирд╣реАрдВ рд▓рд╛рдКрдВрдЧрд╛ред


рдирд┐рд╖реНрдХрд░реНрд╖


рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рддрд┐рдорд╛рди рдореЗрдВ рдмреЙрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд╕рдВрд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдирдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрди рд╕рдВрд╡рд╛рджреЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рд╕рдордЭрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдиреЗ рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдП рдереЗред


рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рд░рд┐рдВрдЧ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдмреЙрдЯ рдХреНрдпреЛрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ - рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред


рд╡реЗ рдРрд╕реЗ рдкреНрд░рддрд┐рдорд╛рди рдореЗрдВ рд▓рд┐рдЦрддреЗ рдереЗред рдЗрд╕ рд╢реИрд▓реА рдореЗрдВ рдЪреИрдЯ рд░реВрдо рдХреА рд╕реЗрд╡рд╛ рдХрд░рдирд╛ рдЖрдИрдЖрд░рд╕реА рдХреЗ рдпреБрдЧ рдореЗрдВ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмреЙрдЯ рдмрдирд╛рдП рдЧрдП рдереЗред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдирд╡реАрдирддрд╛ рдХрд╛ рдвреЛрдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред


рдФрд░ рдЕрдзрд┐рдХред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рддрд┐рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ goto рд╕рдВрдЪрд╛рд▓рдХ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ goto рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрдВрджрд░ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛ (рд╕рдВрд╡рд╛рджреЛрдВ рдореЗрдВ рд▓реВрдк рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ goto рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдкрд╛рдпрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

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


All Articles