Redmine甚の電報ボット。 自分ず人々の生掻を簡玠化する方法

プロゞェクトずタスク管理システムを䜿甚しおいる䌚瀟では、遅かれ早かれ、それをコミュニケヌションを簡玠化するために人気のあるメッセンゞャヌず組み合わせるこずが望たれたす。 特に、このシステムを介しお顧客ずのやり取りがある堎合。



この蚘事では、RedmineをTelegramずフレンドにし、既存のビゞネスプロセスを壊さない方法を説明したす。











䞻題のアむデアがどのように生たれたのかに぀いおの少しの背景。



圓瀟は、24時間幎䞭無䌑のサヌバヌずサむトの管理、倧芏暡で成長䞭のむンタヌネットプロゞェクトのむンフラストラクチャの開発、フォヌルトトレラントシステムの蚭蚈、DevOpsの自動化に埓事しおいたす。



顧客ずやり取りするために、私たちはRedmineを䜿甚したす。Redmineはプロセスに合わせお調敎されおおり、私たちの生掻を楜にする倚くの楜しいものにかかっおいたす。



開始したばかりの2011幎でしたが、タスクトラッカヌを介しおのみ顧客ず通信するこずにしたした。 これは、サヌバヌのサポヌトずむンシデントぞの察応に加えお、ほずんどの䜜業がむンフラストラクチャ開発タスクで構成されおいるずいう事実によるものです。 むンフラストラクチャの珟圚の状態、プロゞェクト開発のベクトルを十分に理解し、ニヌズずボトルネックを正しく評䟡し、゜リュヌションを提案し、それらを調敎し、実装するこずがい぀でも重芁です。 問題は耇雑です。倚くのプロゞェクトがあり、それぞれに䜜業しおいるのは1人ではなく、管理者のチヌムです。 同時に、管理者は亀代で働いおおり、䞀郚の管理者はオフィス内で垞に盞互に亀差しおいるずは限らないため、タスクを実行する必芁がありたす。 したがっお、チヌム内およびシフト間で知識ず行動を同期させるずいう問題は、私たちにずっお非垞に重芁です。



これらすべおの芁因を考慮しお、状況を制埡し続けるための唯䞀の可胜な方法は、すべおの通信ずすべおの䜜業がタスクシステム内で1か所で行われるようにするこずであるず刀断したした。 圓然、プロゞェクトwikiを実行し、アクションずコンテキストの同期の問題を解決するためにさらに倚くのこずを行いたすが、キヌポむントは垞に顧客ずの察話の単䞀ポむントでした。 たずえば、むンスタントメッセンゞャヌなどの別のチャネルをコミュニケヌションに远加するず、いく぀かの問題をすばやく話し合うず、顧客の100がそれを悪甚し始め、無限のコメントの深inにすぐにdrれ、重芁な情報が倱われ始めたす。 はい。管理者は、Redmineでレむアりトされ、明確なビゞネスプロセスのためにレむアりトされたタスクに察しお、5぀の異なるりィンドりで顧客ず混chaずしたコミュニケヌションを行う可胜性はあたり魅力的ではありたせんでした。



その結果、私たちは玄5幎間そのように暮らしたしたが、この間、倚くのお客様がRedmineのシンプルさず機胜性を気に入っおくれたした。 圌ず䞀緒に仕事をした誰かが圌の䌚瀟でそれを玹介するこずにしたした。 個々のクラむアントは、タスクのシステムだけでなく、䜕らかのメッセンゞャヌでもタスクを蚭定できるかどうかをたたにしか尋ねたせんでした。



しかし、過去2幎間で、このようなリク゚ストの数は倧幅に増加しおいたす。 そのため、それらを考慮しないこずは䞍可胜でした。 そしお、これをどうするかに぀いお考えたした。 営業マネヌゞャヌは、い぀ものように、Skype、WhatsApp、たたはTelegramを介した顧客ずのコミュニケヌションを䜜業プロセスに統合するために、奇跡的な方法でアむデアをプッシュしようずしたした。 管理者はこれをたったく望んでいたせんでした。



激しい議論ず議論の埌、すべおのクラむアントメッセヌゞをRedmineの既存のタスクに配眮したり、管理者が通垞の環境で䜜業する新しいタスクを䜜成したりできるTelegramボットを開発するずいうアむデアがありたした。



圌らは小さな蚈画をたずめたした-最初は最小限の機胜で、それから楜しい些现なこず。 しばらくしお、未来のボットのプロトタむプを入手したした。これは、TelegramからRedmineぞ、たたはその逆のメッセヌゞを正垞に配信したした。 これは、アむデアが実行可胜であるずいう自信を䞎えたした。 そしお、私たちはそれを終わらせお立ち䞊げるためにあらゆる努力をしたした。



これがどのように機胜するかをよりよく説明するために、この蚘事は2぀のブロックに分かれおいたす。 最初のブロックには、ボットの䞀般的な説明ずその操䜜䟋が含たれおいたす。 第二に-ボットのデバむスず技術的偎面。



蚘事の最埌には、ボットをダりンロヌドする堎所ず蚭定方法のリンクがありたす。



それで、私たちは䜕を埗たしたか



ナヌザヌ認蚌



たず、ナヌザヌがボットを操䜜できるようにするには、ボットを認蚌する必芁がありたす。

これを行うには、ナヌザヌはアクティブなRedmineアカりントを持っおいる必芁がありたす。



圌はナヌザヌ名を考え出し、Telegramアカりントの蚭定に登録する必芁がありたす。







Redmineアカりントの蚭定の特別な远加フィヌルド「Telegram」に同じナヌザヌ名を入力する必芁がありたす。







次に、ナヌザヌはTelegramでボットを芋぀け、[開始]をクリックしたす。 ボットはそれを蚱可し、歓迎したす







タスク蚭定



新しいタスクをポヌズしたり、既存のタスクにコメントを远加したりするには、ボットにテキストを曞くだけでオプションが提䟛されたす。 同時に、メッセヌゞにファむルを添付できたす。







曞かれたコメントを最埌のアクティブなタスクに远加したり、リストからタスクを遞択したり、それに基づいお新しいタスクを䜜成したり、䜕もせずにダむアログを終了したりできたす。



「最埌のタスクに远加」項目を遞択するず、ナヌザヌのコメントが最埌の通信が行われたタスクに远加されたす。 ボットはそれを䞊に瀺しおいたす。



「新しいタスクを䜜成する」を遞択するず、ボットは新しいタスクを䜜成するモヌドに切り替わりたす。







ナヌザヌにプロンプ​​トを衚瀺したす

















ナヌザヌは、デフォルト倀に満足しおいる堎合はこれらの手順をスキップし、すぐに「タスクの䜜成」をクリックしたす。タむトルを指定するだけです。







その埌、ボットはクラむアントにタスクの䜜成に぀いお通知したすタスクぞのリンクはクリック可胜で、必芁に応じおすぐにチケットにアクセスできたす。







Redmineでは次のようになりたす。







ナヌザヌが「タスクの遞択」をクリックするず、ボットは珟圚開いおいるタスクのリストを提䟛し、そこにコメントを送信できたす。







この堎合、ナヌザヌにはRedmineで接続しおいるプロゞェクトずタスクのみが衚瀺されたす。 これは、ボット内のすべおのアクションに適甚されたす。



タスクに関する察応



ボットは、タスクの倉曎の通知の配信をサポヌトしおいたす。 たずえば、管理者はタスクを完了し、クラむアントに結果を確認するように䟝頌したす。







クラむアントが受け取るものは次のずおりです。







Telegramの察応するメッセヌゞに返信するこずで、タスクに回答できたす。 これは、耇数のタスクを同時に凊理しおいる堎合に特に䟿利です远加の質問なしで、すぐに回答が目的のチケットに移動したす。







結果。 クラむアントはタスクを䜜成し、その䞊で通信し、これらすべおをTelegramで行いたした。 圌はこれのためにRedmineに行く必芁がなかった。 埓業員はRedmineで通垞の方法でタスクを受け取り、凊理したした。暙準的なビゞネスプロセスの䞀郚ずしお、メッセンゞャヌに切り替えおから、連絡先をタスクシステムに転送する必芁はありたせんでした。



添付ファむルのサポヌト



ボットでは、添付ファむルのサポヌトを実装したした。 そしお、それは䞡方の方法で機胜したす。 写真、ドキュメント、ビデオ、オヌディオなど、奜きなものを添付できたす。 ステッカヌを添付するこずもできたすが、ブラりザではあたり芋かけたせんが、残念なこずに、堎合によっおは完党に遞択されたステッカヌがオフィス党䜓の寿呜を延ばしたす。



監芖システムから、サヌバヌの1぀に問題があるず通知されたずしたす。 管理者はRedmineを介しおタスクを䜜成し、監芖システムのグラフをそれに添付したした。 クラむアントは次のメッセヌゞを受け取りたす。







圌は音声メッセヌゞで応答できたす







音声メッセヌゞはタスクに配信され、管理者によっお聞かれたす。



制限事項



もちろんそうです。 以䞋に遭遇したした



  1. 長い投皿。 テレグラムでは、1぀のメッセヌゞの長さに制限がありたす-4096文字。 圓初、Redmineからの長いコメントはクリップされおいたした。 長いコメントをバラバラにするハンドラヌを䜜成する必芁がありたした。 そしお、それは目を楜したせた、぀たり、コメントが単語の䞭倮の4096文字で厳密に分割されず、分割がフレヌズの接合郚できれいに行われたずいうこずです。 顧客にずっおは、この堎合、いく぀かのメッセヌゞが来るずいう䞍䟿さがありたす。
  2. 曞匏蚭定 RedmineずTelegramのフォヌマットは、2぀の異なるナニバヌスです。 しかし、それは理解可胜であり、その目的は倚少異なりたす。 Redmineの曞匏蚭定はTelegramでサヌビスキャラクタヌずしお衚瀺され、読みにくい堎合がありたす。 これたでのずころ、それらを通垞の圢で衚瀺する方法を理解しおいたせんが、この迷惑を排陀する垌望は残しおいたせん。 すべおがTelegramからRedmineに転送されるわけでもありたせん。 たずえば、テキストに特定の絵文字が含たれおいる堎合、Redmineがそのようなメッセヌゞを受信するず、それがカットされたす。 これらは、Redmineデヌタベヌス構造の機胜です。 この問題を解決するためのいく぀かのヒントがあり、それらはテストベンチで正しく動䜜したすが、これたでのずころ、戊闘ベヌスでそれらを䜿甚するこずを恐れおいたす。
  3. 画像の名前。 画像の添付ファむル぀たり、画像をTelegramに添付するず、ボットはfile_xyz.jpg圢匏の名前のファむルを受け取りたす。 したがっお、Redmineではその名前で取埗したす。 ボット自䜓がこれらの名前のファむルを受信するため、ここではただ䜕もできたせん。
  4. これたでのむンタヌフェヌスずすべおのボットメッセヌゞはロシア語のみですが、次のバヌゞョンの1぀では他の蚀語のサポヌトを远加する予定です。


利甚統蚈



発売から2か月を少し過ぎたした。 最初の芳察



  1. 珟圚、タスクの玄3.5がクラむアントによっおボットを介しお䜜成および曎新されおいたす。
  2. 前述のように、ボットは顧客だけでなくアプリケヌションによっおも積極的に䜿甚されおいたす。 タスクに関する通知を受け取りメヌルよりも早く到着する、すぐに応答するのは非垞に䟿利です。 ボットの起動により、内郚タスクの通信速床が向䞊したように感じたす。


ボットの仕組みに぀いお簡単に説明したす





それでは、始めたしょう...



ボットの抂略図は次のずおりです。







Redmineのすべおの倉曎はフックを䜿甚しおボットに配信され、プロゞェクトが発生したむベントのタむプを調べ、このメッセヌゞの受信者のTelegramアカりントを決定しお配信したす。 Telegramの偎から芋るず、すべおが同様の方法で発生したす。メッセヌゞのタむプ、Redmineに関連しお配信されるタスクが決定されたす。



それでは、少しアクションを远加しお、Telegramでのメッセヌゞ配信のいく぀かの機胜を理解したしょう。



Telegramは、倧きなメッセヌゞをいく぀かの小さなメッセヌゞに分割したす。 これらのメッセヌゞには倚少の遅延が䌎いたす。 すべおの添付ファむルは個別のメッセヌゞずしお配信され、堎合によっおはナヌザヌがダりンロヌドする際に長い遅延が発生したす。 すなわち 受信したすべおのメッセヌゞを受け取っお転送するこずはできたせん。そうしないず、ナヌザヌをスパムしおカルマを台無しにしたす。



そしお䜕をすべきか このためにメッセヌゞキュヌを䜜成し、Redisを䜿甚しお保存するこずにしたした。 ボットは、各着信メッセヌゞをキュヌに入れ、その凊理の遅延時間を曎新したす。 この遅延の期限が切れるず、メッセヌゞは完党に圢成されたず考えられ、タスクを遞択しおRedmineに送信できるようになりたした。



その埌、Redmineで適切なタスクを遞択する方法が問題になりたす。 実際、ボットが受信したデヌタをどう凊理するかを理解するには、ナヌザヌにそれに぀いお尋ねる必芁があり、これはずにかく別のメッセヌゞでありボタンのクリックであっおも、ナヌザヌの以前のアクションに䜕らかの圢で接続する必芁がありたす。 このセッションは圹に立ちたす。



ナヌザヌのテレグラムアカりントから受信した最初のメッセヌゞ-次を含むセッションを生成したす。





Telegramから受信した埌続の各メッセヌゞは、セッションをデヌタで補完するか、その状態を倉曎するたずえば、デヌタのさらなる凊理ず配信のプロセスを開始するか、セッションを砎棄するたずえば、ナヌザヌがコメントを曞くように気を倉えた堎合か、゚ラヌに぀ながるたずえば、受信したデヌタのタむプは、セッションの珟圚の状態に察応しおいたせん。



ボットのもう1぀の重芁な芁玠はキャッシュです。 Redmineは、かなり倚数のプロゞェクト、ナヌザヌ、その他のデヌタで構成されおいたす。 ボットはしばしばこのデヌタにアクセスする必芁があり、Redmineで毎回それらに埓うず、リク゚ストの凊理に顕著な遅延が発生したす。

ボットには、Redmineから残りのプロセスに必芁なデヌタを定期的に取埗し、Redisに保存するこずのみに関係する別のプロセスがありたす。



MySQLはどうですか



Redisに加えお、ボットもMySQLを䜿甚するこずに泚意しおください。 もちろん、すべおのデヌタはRedisに保存できたすが、定期的なダンプが存圚するにもかかわらず、デヌタはただメモリに保存されおおり、システムの予期しないクラッシュによっおデヌタが倱われる可胜性がありたす。その䞭には、特に泚意が必芁な非垞に重芁な情報がありたす。 危機にwhatしおいるものをよりよく理解するために、蚘事の最初の郚分を思い出しおください。 ナヌザヌは、ボットずの察話からメッセヌゞをどう凊理するか新しいタスクを䜜成するか、既存のタスクを遞択するだけでなく、メッセヌゞに応答するこずもできるず述べたした。 ボットは、远加する必芁があるタスクを理解する必芁がありたす。



Telegramでは、メッセヌゞにはRedmineのタスク識別子ずは関係のない識別子がありたす。 それらを友達にするには、䜕らかの通信を確立し、このデヌタを保存する方法を決定する必芁がありたす。 しかし、その前に、このデヌタがどのように圢成されるのか、このデヌタが倱われた堎合に䜕が起こるのか、そしおこれに基づいお、その重芁性を理解しようずしたす。



ナヌザヌが最初のメッセヌゞを電報ボットに曞き蟌むずしたす。 ボットはセッションを開き、ナヌザヌからコメントを远加する必芁があるタスクを芋぀けたす。 回答を受け取った埌、ボットはデヌタをRedmineに送信するず同時に、この通信を自宅で保存したす。



さらに、ナヌザヌがテレグラムでこのメッセヌゞに返信するず、ボットは「芪」メッセヌゞの番号を受け取り、コメントの送信先のRedmineタスクの番号を決定したす。 説明された察応は、この新しいメッセヌゞに察しおも確立されたす。 その埌、返信を行うこずができたす。 Redmineからのむベントに぀いおも同様です。 クラむアントは、これが非垞に䟿利なメカニズムであるず考えおおり、統蚈から刀断するず、非垞に積極的に䜿甚しおいたす。



ここで、これらすべおの通信が倱われたず想像しおみたしょう。 すなわち クラむアントは、習慣ずしお、管理者から送られたメッセヌゞぞの返信をクリックし、コメントを曞いおボットに送信したす。 しかし、以来 説明されたアルゎリズムによるボットは、コメントを送信するタスクを理解できなくなり、゚ラヌメッセヌゞが衚瀺され、次に䜕をすべきかを芋぀けるために远加の質問が行われたす。



倱われない他の重芁なタむプのデヌタおよび最初のデヌタよりも倚く倱われるこずはありたせんは、RedmineずTelegramのナヌザヌIDの察応です。 これが発生した堎合、ナヌザヌはボットに䜕かを曞き蟌むたで、Redmineで発生するむベントに関する情報の受信を停止したす。 そしお以来 䞖論調査によるず、ボットはメヌルを眮換するための通知者ずしお䜿甚されるこずが倚く、ここでさらに問題が発生する可胜性がありたす。



ナヌザヌを混乱させないために、このデヌタをより高速で信頌性の高いMySQLに配眮したす。



公平に蚀うず、MySQLを攟棄しおこのデヌタをRedisに転送するかどうかに぀いお、私たちのチヌムがただ議論しおいるこずは泚目に倀したす。 そのため、将来的には、Redisの䜿甚に完党に切り替えられる可胜性があり、堎合によっおは他のストレヌゞシステムに切り替えるこずもできたす。 幞いなこずに、アプリケヌションのアヌキテクチャにより、このような眮換は比范的簡単になりたす。



スケヌリングずフォヌルトトレランス



次に、ボットのスケヌリングずフォヌルトトレランスを確保する方法に぀いおお話したいず思いたす...



ボットの出珟により、私たちのRedmineは堎合によっおはチャットに倉わり、メッセヌゞングの匷床は絶えず増倧しおいたす。 䞀郚のお客様は、むンフラストラクチャに統合するこずも望んでいたす。 そしお、私たちの開発は完党にオヌプン゜ヌスであるずいう事実を考えるず、管理者/開発者の他の䌚瀟やチヌムがそれをどのように䜿甚したいかは䞍明であり、ボットが䜕に遭遇するかは䞍明です。 したがっお、プロゞェクト開発の段階でさえ、その䞭にスケヌリングの可胜性を芋出したした。



このプロゞェクトでは、スケヌリングを2぀のクラスに分けるこずができたす。





ボットのスケヌリング方法を理解するために、メッセヌゞを受信および凊理するプロセスを詳しく芋おみたしょう。



回路図は次のずおりです。







「REST API」プロセスの唯䞀のタスクは、RedmineたたはTelegramから受信したメッセヌゞをra-queueに入れ、次を埅぀こずです。 このキュヌは、キュヌワヌカヌプロセスによっお垞に監芖されおおり、キュヌにデヌタが衚瀺されるず読み取られたす。



Redmineからのメッセヌゞはすぐに凊理され、Telegramの適切なナヌザヌに送信されたす。 Telegramからのむベントでは、すべおがより耇雑です。なぜならすぐにRedmineに送信するこずはできたせんその理由は䞊蚘のずおりです。その埌、ナヌザヌによっお既に分割されおいる別のキュヌに転送されたす。メッセヌゞのタむプは、他のメッセヌゞを埅぀時間を決定したす。遅かれ早かれ、これらのメッセヌゞはすべお読み取られ、準備が行われ、䜕らかの圢でセッションの状態が倉曎され、同じステップでTelegramからダりンロヌドされたすべおの添付ファむルずずもにRedmineに送信できたす。



このアプロヌチず既存のロックメカニズムのおかげで、凊理は垞に1぀の特定のノヌドで行われるこずに泚意するこずが重芁です。これにより、既存の負荷内で必芁な数のQueue-workersプロセスでボットむンスタンスを䜜成できたす。



Redmineがメッセヌゞを受信するず、フックがトリガヌされ、同じメッセヌゞがボットに返送された埌、タスクにサブスクラむブしおいる残りのTelegramアカりントに配信されたす。



したがっお、分散バヌゞョンのボットのむンフラストラクチャは次のように衚すこずができたす。







しかし、説明したすべおが、1぀のMySQLサヌバヌずRedisの通垞の非クラスタヌバヌゞョンを備えた通垞のスタンドアロンバヌゞョンでボットを䜿甚する機胜を制限するわけではありたせん。



ボットを詊す方法は



ボットの動䜜を実蚌するために、デモ版を䜜成したした。デモ版はdemo.nxs-chat.nixys.ruから入手できたす。



実際に詊しおみるには、いく぀かの準備手順に埓う必芁がありたす。







重芁なお知らせボットは、次の堎合にメッセヌゞをTelegramに送信したす。



ボットを取埗する方法は



ボットは完党にオヌプンであり、゜ヌスコヌドの圢匏ずパッケヌゞの䞡方で入手できたすパッケヌゞは珟圚Debian 8でのみ利甚可胜ですが、近い将来Debian 9およびCentOS 7で利甚可胜になる予定です。ボット゜ヌスコヌドを䜿甚



しおGithubリポゞトリにリンクしたす。パッケヌゞからボットをむンストヌルしおセットアップするための指瀺もありたす。



おわりに



近い将来、次の機胜を远加する予定です。






All Articles