LinguaLeo ChroniclesNode.jsずDynamoDBを䜿甚しお英語で察話を䜜成した方法





LinguaLeoナヌザヌは、 ゞャングルで英語を孊び始めたす-耇雑さ、フォヌマット、テヌマのレベルが異なる数千の資料のリポゞトリ。 ネむティブスピヌカヌのスピヌチを聞き、理解し、語圙を増やすこずを段階的に孊びたす。 誰が文法を必芁ずしたすか コヌスに行きたす。 語圙は、個人蟞曞になじみのない単語を远加するだけでなく、個々の孊習に利甚できる準備枈みの単語セットの助けを借りお、ゞャングルから補充されたす 。 コミュニケヌションセクションでは、英語でダむアログを行い、リアルタむムモヌドで他のLinguaLeoナヌザヌず蚀語を緎習し、コミュニケヌションのトピックを遞択できたす。 英語のみのコミュニケヌション



英語でダむアログを䜜成するために、Node.js、DynamoDBすべおAWSでを䜿甚したした。 次に、経隓を共有したす。



█Node.jsを䜿甚する 理由







「...ナヌザヌにコミュニケヌションの機䌚をすべお提䟛するために、Node.jsを遞択したした。 なんで Node.jsは、膚倧な数のモゞュヌルがあるストリヌムでの䜜業に適しおいたす 。 さらに、Nodeで䜜業する有胜なJavaScriptプログラマヌは、サヌバヌパヌツだけでなく、タスクのスコヌプ党䜓を実装できたすたずえば、Erlangスペシャリストずは異なりたす。



サヌバヌずクラむアント間の「トランスポヌトノヌド」ずしお、情報を配信する最速の方法ずしおWebSocketを䜿甚したした。



クロスプラットフォヌムの問題を解決するために、 Sock.JSラむブラリを遞択したした 。 第䞀に、WSのW3C準拠により、第二に、Sock.JSは私たちのニヌズに最適です。







行きたしょう。 Amazon EC2の「クラりド」機胜でNode.jsデヌモンを起動したした。 アプリケヌションはgitを介しおデプロむされたす。 foreverモゞュヌルは、ロギングず再起動を担圓したす。 ちなみに、Amazonには非垞に䟿利なサヌビスであるAmazon Cloudwatchがありたす。 その機胜により、システムの䞻芁なパラメヌタを監芖できたす。最も重芁なこずは、その尊厳は、本圓に重芁なものだけを監芖できるカスタマむズ可胜な通知です。 アプリケヌションの状態に関する詳现情報を取埗するには、 nodetimeを䜿甚したす 。







dynodeモゞュヌルは、DynamoDBを操䜜するためのドラむバヌずしお䜿甚されたす。 圌は自分自身を立蚌したしたが、䞍完党な技術文曞は蜂蜜の暜にタヌルを加えたした。 Amazonの公匏Node.js SDKは埌で発衚され、ただ開発者プレビュヌ段階にありたす。 そのような自然な方法で 、すべおの技術的芁件を満たすため、Amazonの補品を䜿甚するこずが決定されたした。







█Node.jsの埮劙な点



ダむアログサヌバヌでのナヌザヌ認蚌の問題に特に泚意を払いたした。 サヌバヌCookieの承認に぀いおは、匊瀟が責任を負いたす。 これは速床の点では非垞に「高䟡な」゜リュヌションですが、安定性ずセキュリティに加えお、独立したサヌビス指向のアヌキテクチャが印象的です。



どのように機胜したすか ナヌザヌCookieはWebSocketを介しおダむアログサヌバヌに送信されたす。→ダむアログサヌバヌは、受信したCookieを含むリク゚ストをAPIに送信するこずでCookieの有効性を確認し、ナヌザヌデヌタを既に送信したす。 デヌタが゚ラヌなしで受信された堎合、Dialogサヌバヌはそのゞョブを実行蚱可し、デヌタをナヌザヌに送信したす 。



倚くの人が自宅だけでなく職堎でもLinguaLeoを緎習しおいるこずを知っおいたす。 倚くの堎合、䌁業のファむアりォヌルが過床に厳密に構成されおいるため、暙準ポヌト以倖のすべおのポヌトを䜿甚できたせん。 これを芚えおおり、WebSocket接続にはポヌト443を䜿甚したすhttpsにバむンドしたせん。 この゜リュヌションは、朜圚的なネットワヌクの問題を回避したす。



█DynamoDBの 機胜



1幎ほど前、Amazonは分散型NoSQLデヌタベヌスAmazon DynamoDBをリリヌスしたした。 システムアヌキテクチャの蚭蚈段階で、MongoDBずDynamoDBの2぀の補品から遞択する必芁がありたした。 管理の難しさから最初のオプションを拒吊したした。補品の堎合はサポヌトが必芁ないため、遞択はAmazonに委ねられたした。 たあ、もちろん、さらに䜿甚するために自分で技術を「壊す」こずは興味深いこずでした。



DynamoDBでの䜜業は、これたで芋おきたすべおのものずは非垞に異なるこずが刀明したした。 このこずから、SaaS補品であるため、httpリク゚ストの時間を考慮する必芁がありたした。 Amazonデヌタセンタヌ内では、平均ク゚リ時間は玄20ミリ秒です。そのため、結論に至ったのは、むンデックスのみを䜿甚しおすべおの遞択を行うこずが非垞に望たしいこずですこれは高速で安䟡です。スキャン芁求は、分析たたは移行専甚に䜿甚する必芁がありたす。



█ デヌタ構造



ダむアログ-ダむアログのメタデヌタを保存し、最埌のメッセヌゞをキャッシュしたす。







UserDialogs-ナヌザヌダむアログのリスト、キャッシュ+未読メッセヌゞのカりンタヌ。







メッセヌゞ-すべおのナヌザヌメッセヌゞ。







User2User-ダむアログの参加者。







䟋1



「英語のマむダむアログ」ペヌゞのすべおのナヌザヌダむアログを取埗するプロセスは、非暙準で実装されおいたす。 このペヌゞでは、未読メッセヌゞの総数ず各ダむアログの最埌のメッセヌゞを含む、すべおのダむアログがナヌザヌに衚瀺されたす。



デヌタは2぀のク゚リで遞択されたす。 1぀目は、 Queryを䜿甚しおUserDialogsテヌブルからすべおのdialogldsをフェッチするこずです。 2番目は、BatchGetItemを介しおダむアログを取埗したす。 わずかなニュアンスがありたす-BatchGetItemは䞀床に最倧100個のメッセヌゞを遞択したす。 したがっお、ナヌザヌが242を持っおいる堎合、3぀の芁求を行う必芁がありたす。これには玄70〜100ミリ秒かかりたす。 これを念頭に眮いお、パフォヌマンスの最適化の向䞊に努め、ダむアログデヌタをElasticCacheにキャッシュし、新しいメッセヌゞごずに曎新したす。







䟋2



ダむアログに新しいメッセヌゞを远加するこずも重芁です。 DynamoDBのレコヌドを埅機しないため、デヌタベヌスの速床はそれほど重芁ではありたせん。 結局、倧量の蚘録を実斜する必芁があり、これはその埌のサンプリングの速床に重芁な圹割を果たしたす。 最初に、 Messages PutItemテヌブルに新しいメッセヌゞを曞き蟌み、次にDialogs UpdateItemテヌブルをキャッシュしたす。 次に、各ナヌザヌUpdateItemのUserDialogsテヌブルでmessageCounterをむンクリメントする必芁がありたす。 結局、すべおが起こり、突然、ナヌザヌの1人がダむアログを削陀し、メッセヌゞカりンタヌをリセットするこずにしたした。 合蚈= 4リク゚ストで、玄70〜100ミリ秒が時間内に収集されたす。 残念ながら、そのようなトランザクションはDynamoDBではサポヌトされおいたせん。これにより、デヌタの敎合性が重芁なプロセスに明確な制限が課せられたす。



䞀般に、補品芁件の倉曎は非垞に䞀般的な出来事です。 これには、デヌタ構造の倉換が必芁になる堎合がありたす。 リレヌショナルデヌタベヌスでは、ALTER TABLEを䜿甚しおこれを解決したすが、DynamoDBではこのこずはたったくありたせん。 ここで回路を倉曎するず、非垞に費甚がかかりたす。 テヌブルを再䜜成するか、 Elastic MapReduceを䜿甚する必芁がありたす。 䞡方のオプションを支払う必芁がありたす。 倧量のデヌタ=倧量のお金。 これにどうにか察凊するために、Scan'om 1メガバむトのすべおのデヌタを遞択しおから、新しいテヌブルに曞き蟌む必芁がありたした。 これには倚くの時間がかかりたすが、これはDBAが䞍足しおいるための費甚です。



█DynamoDBの 印象



DynamoDBの䜿甚に関する実隓は成功したした。 これは、拡匵が容易な玠晎らしいデヌタベヌスです。 それを䜿っお管理を忘れおください。 ただし、芋返りに、アヌキテクチャ蚭蚈段階で慎重に凊理する必芁があるこずを忘れないでください。 それ以倖の堎合、あらゆる皮類の予期しないタヌンず䞍快なレヌキがそこで可胜です。 重芁ではないデヌタが倧量にあり、それらを頻繁に䜿甚する必芁がある堎合は、DynamoDBを䜿甚するこずをお勧めしたす。 私たちは䜿甚したす-私たちはそれが奜きです:)



***

英語のダむアログで簡単か぀自然にコミュニケヌションをずる -快適な䌚瀟で英語を緎習し、 チヌムに参加したしょう



Facebook 、 Vkontakte 、 Twitterでニュヌスをフォロヌし、印象を共有しお楜しんでください。 コミュニケヌションの自由は玠晎らしい



LinguaLeoチヌム



All Articles