2011-02-04 6 views
1

これは支払い処理に固有のanother questionに関連しています。これは私の使用例ですが、beanstalkdを使用して同じサーバーにnode.jsとrubyを統合しようと考えていました。基本的には、メインWebサーバーとしてnode.jsを使いたいのですが、支払い処理が必要なときは、Rubyのような堅牢で安定したものを使いたいと思います。node.js/beanstalkdとの統合

私は、node.jsがルビーがバックグラウンドで実行する支払い処理ジョブをキューに入れる方法としてbeanstalkdを使用しようと考えていました。 beanstalkdのドキュメントはちょっとスリムなので、これが良いアプローチかどうか、あるいは私がそれについてどうやってどうやってやるのか分かりません。私が知ることから、Beanstalkdプロセスを起動し、node.jsに接続してジョブを送信し、ジョブを実行して結果を返すことができるRubyスクリプトを作成するのはかなり簡単です。

+1

私はredisメッセージキューセマンティクスを代わりに使用します。利用できる非常に良いc拡張があるので、node.jsの方が速くなると思います。 – Alfred

答えて

0

だから十分に根を張った後、私は本当にBeanstalkdを評価するために必要なドキュメントを見つけました。ソースには私が読んでいたものからリンクされていないprotocol documentがあり、その機能と制限についてのより詳細な情報を提供するメインページ(docというフォルダにありますが)です。

node.jsに最適な非同期ワーカーキューとして非常に使いやすいですが、支払い処理を行うためにRubyコードと通信するのに適していますが、dkamによれば、クライアントを更新できるようにnode.jsに応答してください。私はこれが多くのタスクにとって理にかなっていると思っていますが、それは私にとって十分ではありません。

アルフレッドのアドバイスを受けて、私はレディスを調査しましたが、それがまさに私が必要とするものではありませんが、十分であると思います。すでにactor libraryがRubyのredisの上に構築されているので、ノードとRubyとの間で、おおまかなアクタースタイルのセマンティクスや少なくともコールバックセマンティクスを使って話すことができるはずです。

+0

もしあなたがBeanstalkを使用するのであれば、Node.jsにトランザクションレコードを作成させ、状態を "Queued"に設定するなどと思います。そのレコードは顧客のトランザクション状態になります.Node.jsはそのレコードをポーリングします。あなたのRubyプロセスがジョブを取得したら、DBレコードを "Pending"に更新し、完了したら "Complete"または "Failed"を一度実行します。 – dkam

+0

私はこれについては確信していませんが、Redisは私が推測しているPubSubにポーリングを使用していません。 Redisは高速で稲妻であり、ノードとルビプロセスと同じボックスに置かれます。私はこれがおそらくデータベースをポーリングするよりもきれいな設定だと思う。私が間違っていると聞いてうれしく思います。 –

3

この作業には豆が適しています。 binlogオプションを使用して、Beanの再起動の間にジョブを永続化させるようにしてください。

あなたのNode.jsのプロセスは、(「支払い」と言う、と呼ばれる)チューブと適切な優先順位で、それにジョブを置くを使用します。

Rubyスクリプトでを参照して、支払チューブを見て、ジョブを処理します。

ジョブに十分なTTLを与えてください。つまり、BeanStalkでジョブが失敗したとみなして再キューする前に、支払い処理に時間がかかることを確認します。

ちょうど好奇心 - お支払いが成功したというフィードバックをお客様にどのように提供しますか?おそらくRubyスクリプトはデータベースのレコードを更新するでしょうか?

+0

ええ、私は結局のところ、beanstalkdプロトコルのドキュメントを見つけることができたので、これは理にかなっていましたが、厄介な点はフィードバックでした。その部分を行う唯一の方法は、node.jsが待っているリターンチューブや、仕事のIDに固有のリターンチューブを用意することだと確信しています。結局、私はredisがもっと良い解決策かもしれないと思っています。 –