2010年2月 8日

cacti の設定をコマンドラインから行う方法
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは。kyagi です。今回は cacti の設定をコマンドラインから行う方法をお知らせいたします。

cacti とはサーバの監視/グラフ化ツールです。CPU使用率やロードアベレージ、その他様々な情報をカラフルなグラフで見ることができます。

設定は主にブラウザ上から行うのですが1台のサーバの設定でもSNMPの各項目を選択したり、グラフのデータ元であるデータクエリを設定したりなかなかの作業量になります。設定内容は全て把握していても 1 台につき、マウスでクリックする回数が多いので数十台の追加となると時間もかかりますし、指もかなり疲れます(また、ヒューマンエラーも入り込む余地が生まれます)。

cacti にはこういった設定をコマンドラインから行える php スクリプトが用意されています。標準ではこれらのスクリプトは /var/lib/cacti/cli/ 配下にインストールされています。これらのスクリプトの使用方法は --help オプションをつけると表示されますが、html 版のドキュメントも用意されています。

■cacti の設定をコマンドラインから行える php スクリプト

$ rpm -ql cacti | grep cli | grep php$
/var/lib/cacti/cli/add_data_query.php
/var/lib/cacti/cli/add_device.php
/var/lib/cacti/cli/add_graph_template.php
/var/lib/cacti/cli/add_graphs.php
(...snip...)

■上記 php スクリプトのヘルプドキュメント

$ rpm -ql cacti | grep cli | grep html$
/usr/share/doc/cacti-0.8.7e/docs/html/cli_add_data_query.html
/usr/share/doc/cacti-0.8.7e/docs/html/cli_add_device.html
/usr/share/doc/cacti-0.8.7e/docs/html/cli_add_graph_template.html
/usr/share/doc/cacti-0.8.7e/docs/html/cli_add_graphs.html
(...snip...)

以下にこれらのスクリプトを使用して newserver というサーバを追加していく例を紹介いたします。

1.まず、追加するサーバのタイプ(Web サーバだったり、DB サーバだったりします)を指定するための template の id を調べます。

$ sudo -u cacti php /var/lib/cacti/cli/add_device.php --list-host-templates
Valid Host Templates: (id, name)
0	None
1	Generic SNMP-enabled Host
3	ucd/net SNMP Host
4	Karlnet Wireless Bridge
5	Cisco Router
6	Netware 4/5 Server
7	Windows 2000/XP Host
8	Local Linux Machine
9	X DB Server HT
10  	WebServer - Apache
11	Memcached Server
12	X Nginx Server HT

2. ここでは template としてシンプルな None を選びます。template が決まったので add_device.php で device を追加します。ここでの cacti の出力の device_id の 90 が以下に使う「--host-id」に渡す値になります。

$ sudo -u cacti php add_device.php --description=newserver --ip=10.0.0.123 --version=2 --avail=pingsnmp --community=public --template=0
 
Adding newserver (10.0.0.123) as "None" using SNMP v2 with community "public"
Success - new device-id: (90)

3. Data Query を追加します。サンプルとして以下 3 つ(SNMP interface, ucd/net Get Mount, SNMP Get Mount Partitions) を追加します。「--host-id」に先ほどの値 90 を使用します。

$ sudo -u cacti php add_data_query.php --host-id=90 --data-query-id=1  --reindex-method=1 #SNMP interface
$ sudo -u cacti php add_data_query.php --host-id=90 --data-query-id=2  --reindex-method=1 #ucd/net Get Mount Partitions
$ sudo -u cacti php add_data_query.php --host-id=90 --data-query-id=8  --reindex-method=1 #SNMP Get Mont Partitions

4. Graph Template を追加します。サンプルとして CPU 使用率、ロードアベレージ、メモリ使用量を追加します。グラフテンプレートIDは「--list-graph-templates」オプションで見ることができます。

$ sudo -u cacti php add_graph_template.php --host-id=90 --graph-template-id=4  #ucd/net CPU Usage
$ sudo -u cacti php add_graph_template.php --host-id=90 --graph-template-id=11 #ucd/net Load Average
$ sudo -u cacti php add_graph_template.php --host-id=90 --graph-template-id=13 #uce/net Memory Usage

5. Graph を追加します。サンプルとして CPU 使用率、ロードアベレージ、メモリ使用量を追加します。

$ sudo -u cacti php add_graphs.php --host-id=90 --graph-template-id=4 --graph-type=cg
$ sudo -u cacti php add_graphs.php --host-id=90 --graph-template-id=11 --graph-type=cg
$ sudo -u cacti php add_graphs.php --host-id=90 --graph-template-id=13 --graph-type=cg

使い方がわかればこれらをバッチ処理で実行するスクリプトを作成して更に効率化することも可能です。
http://github.com/kyagi/cacti-add-device-helper.rb/blob/master/cacti-add-device-helper.rb

ウノウでは特に最近、積極的にエンジニアを採用しています。
採用ページをご覧になり興味のある方、ぜひご応募ください。
Find Job!でも募集してます!

2010年2月 3日

位置情報を取得してみる
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

ウノウでは特に最近、積極的にエンジニアを採用しています。
採用ページをご覧になり興味のある方、ぜひご応募ください。
Find Job!でも募集してます!

こんにちは。ryosuke です。

先週からモバゲータウン内において、弊社の携帯まち育成ブラウザゲーム「まちつく!モバゲー版」の提供を開始しています。よろしければ遊んでみてください。

まちつく!は、まち育成シミュレーションゲームですが、育成だけではなく携帯電話の位置情報を利用したおみやげやスタンプといった機能があります。最近は海外でもGPS機能を搭載したスマートフォンが普及してきたためか、世界的に位置情報を利用したサービスが活発化し始めているようです。

NHKのTV番組ブラタモリと連携しているiPhoneアプリの「ブラアプリ」や、位置情報でつながる街情報SNS「foursquare」 が話題になったりしていていますね。位置情報自体は今更感があるのですが、個人的興味でにわかに位置情報がホットです。

携帯電話

位置情報の活用と言えば一番に思い浮かぶのが携帯電話ですね。基地局を利用した位置情報とGPSを利用した位置情報があり、日本の携帯電話ではなじみの深い機能ですがGPSは実装が義務化されているそうです。

docomo

オープンiエリアでは5桁のエリアコードが付いており、公開されているエリアテーブルと関連づける事で全国を505に分割した地域名を取得できます。

<a href="http://w1m.docomo.ne.jp/cp/iarea?ecode=OPENAREACODE&msn=OPENAREAKEY&nl=URL&posinfo=1">位置情報を送る</a>

GPSはaタグやformタグにlcsを付けるだけで、リンク先に位置情報関連の引数を付けて渡してくれます。

<a href="URL" lcs>位置情報を送る</a>

au

簡易位置情報はドキュメントどおり以下の様に取得します。
<a href="device:location?url=URL">位置情報を送る</a>

auはGPSに関する資料は正式に公開されてはいないようです。しかしwebを検索すると有用な情報が揃っています。

簡易位置情報は上記サイトでドキュメント化されていますが、GPSも簡易位置情報の device:location となってる所を device:gpsone に変更すれば、同様に扱えます。

<a href="device:gpsone?url=URL">位置情報を送る</a>

SoftBank

SoftBank も au と同様に以下の様にURLにリンクする事で指定したURLに位置情報を渡してくれます。
<a href="location:cell?url=URL">位置情報を送る</a>

GPSの場合は cell の部分が gps になります。

<a href="location:gps?url=URL">位置情報を送る</a>

WILLCOM

忘れてはいけない WILLCOM です。会社にPHSがあったので、今回はじめて試してみましたが、携帯キャリアと同様に取得できました。(まちつく!mixi版はPHSでも遊べます)

<a href="http://location.request/dummy.cgi?my=URL&pos=$location">位置情報を送る</a>

スマートフォン

iPhone

未確認ですが、Core Locationフレームワークを使用するそうです。

Core Location Framework Reference

Android

android.location パッケージが提供されています。

android.location

参考

WEBブラウザ

Firefox

Firefox 3.5以降ではプラグイン等を必要とせず、標準でGeolocation APIがサポートされています。

Geolocation の利用

場所にもよるのかもしれませんが、試してみた所なかなか良い精度で位置情報を取れました。

Safari

  • iPhone OS3.1のSafariではGeolocation APIがサポートされているようです(未確認)
  • ちなみに MacOSX Snow LeopardのSafari4.0.4では動作しませんでした

その他位置情報に関するAPI

取得した位置情報を簡単に加工する事が出来ます。

沖電気提供の位置情報API

http://okilab.jp/project/location/

その他、位置情報の加工に便利そうなAPIが提供されています

シリウステクノロジーズ提供の位置情報API

http://lab.cirius.co.jp/GeoPlatformAPI/

まとめ

実際調べてみると、各社の資料を読むに尽きる感じですが、位置情報を取得すること自体はどの環境でも難しい印象はありませんでした。

実際には取得した情報を加工して使用する事になる為その辺りの処理を行わなければなりませんが、環境ごとに資料やライブラリは揃っているので(ウノウラボでもGeomobilejp_Converterを公開しています)試してみてはいかがでしょうか。

2010年2月 2日

ありえるえりあ勉強会@五反田~テスト編~ 発表資料
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは! 山本@テスト番長です。

1/29にアリエルさんとウノウが合同で実施したピザパーティ 勉強会でお話する機会を頂きました。お集まりいただきました皆様、どうもありがとうございました。

その時の資料を公開したいと思います。


発表中、最近はなるべくテストをしないように心掛けている、と言ったところ
後で数人の方からその点について質問されました。
また後日考えを纏めて、文章の形で皆さんにご説明してみたいと思っています。


アリエル佐藤寛之さんの発表資料はこちらです。
大変興味深い内容ですので、ぜひご覧ください。
ありえるえりあ勉強会@五反田~テスト編~ 資料

2010年1月20日

Flash Lite初学者の為のまとめ
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

おはようございます。内田です。
最近はmixiアプリモバイルやモバゲー上のゲームのようなソーシャルゲームが流行ってるようですね。
私もソーシャルゲーム&Flash Lite案件を手がけることになったので、その時に参考にしたサイトを紹介します。

開発の前に覚えること

最初にFlash Liteの仕様とケータイ開発の障壁ともいえるキャリア間の差異を知る必要があります。

  • Flash Lite ことはじめ。
    • 我らがryosuke氏のエントリー
    • 仕様とキャリア毎の情報が分かりやすくまとまってます。

コンテンツの作成

Flash Liteコンテンツのつくりかたです。

動的生成

ゲームコンテンツの場合、動的にswfを合成することが多くあると思いますが、非常に悩ましい部分です。皆様がどのような方法で開発をおこなっているのか是非教えてください!

  • Ming
    • swftophpコマンドによりswfをPHPに変換できる(perl,pythonもある)
    • 試してみたがまともに動かない
    • 有識者様の意見を是非!
  • swfmill
    • swf⇔xmlの相互変換ツール
    • 使ってみた感じでは非常に安定しています
    • しかし外部コマンドを叩いて生成するため、mingと比べると遅いかもしれない

Tips

Flash Lite1.1の鬼門ともいえる100K制限をなんとかするためのTips達です。非常に参考になります。
しかし100Kに収まったとしても、重くてまともに動作しない端末もあるので油断できませんね。

おわり

2010年1月 3日

Amazon Web Services入門: PHPとEC2/S3/SQS/SimpleDBで作るビデオ共有サイト
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

新年あけましておめでとうございます、五十川です。

PHPデベロッパー向けのAmazon Web Services(AWS)のリソースはhttp://aws.amazon.com/php/にまとめられていますが、そのArticles & Tutorialsカテゴリーにある、Introduction to AWS for PHP Developersという記事は、AWSの主要サービスの概要と、PHPによるその操作を学ぶチュートリアルで、ここで取り上げられているサービスに初めて取り組むPHPデベロッパーには格好の入門となっており、ここではこのチュートリアルを紹介したいと思います。

また、このチュートリアルはAmazon純正のライブラリを利用していますが、AWS用のライブラリには様々なものがあり、この記事の最後ではそのひとつ、CloudFusionを紹介しようと思います。

なお、以下のチュートリアルのスクリプトの実行には、もちろんAWSアカウントが必要で、スクリプトの実行に応じてAWSの利用料が課金されます。チュートリアルには、例えば起動したEC2インスタンスを停止(Terminate)するなど、余計な課金がされないようにする手順は説明されていませんので、AWS Console各種デベロッパーツールを利用して(あるいはチュートリアルの復習も兼ねて、そうしたプログラムを自作するなどして)、適宜対処してください。

チュートリアルのシナリオ

チュートリアルはビデオ共有サイトを題材にしており、AWSのうち、EC2S3SQSSimpleDBを利用します。

  • ウェブサーバはEC2でホストされる
  • ユーザは任意の形式のビデオをサイトのファイルアップロードフォームからアップロードできる
  • アップロードされたビデオはS3に保存され、SQSで管理されるバッチプロセスでFLVに変換される
  • 変換されたビデオはS3に保存され配信される
  • ビデオのメタデータはSimpleDBに記録される

一般的なビデオ共有サイトでは、ユーザから投稿される様々な形式のビデオを、共通の形式(一般的にFLV)に変換して視聴に供します。ビデオの変換は相応のリソースと時間を消費するため、バッチプロセスで処理され、キューシステムで管理されますが、チュートリアルではここにSQSを採用しています。また、バッチプロセスをウェブサーバとは別のコンピュータ(EC2インスタンス)に分離し、さらにそれらが複数に分散されることを想定し、変換前後のビデオはS3に保存します。

チュートリアルの著者について

チュートリアルの著者は、Feedsterを経て現在はAPIのマネージメントサービスを提供するMasheryのチーフアーキテクトを務めるClay Lovelessさんです。彼はオライリーのPHP Cookbook Second Editionの4つの章の著者であり、かつて存在していたpearified.comの運営者でもありました。また、このチュートリアルで使われるS3のストリームラッパー実装(Killersoft_Wrapper_S3)とSOAPクライアント(AWSSoapClient)は彼自身の手によるものです。

チュートリアルファイルのダウンロード

http://s3.killersoft.com/AWSforPHP/awsfiles.zip

チュートリアルのPHPスクリプトは、バージョン5.1.2以上のPHPでの実行を前提にしています。チュートリアルファイル中のcompatibility.phpで動作要件を確認できます。

チュートリアルはAmazon純正の以下のライブラリを利用します。

チュートリアルファイルにはこれらのライブラリが含まれていますが、それらはチュートリアルが執筆された時点のバージョンのものであり、最新のものではありません。当然、対象となるAPIバージョンもチュートリアルの執筆時点のものとなっている点に注意してください。

設定ファイルの作成

チュートリアルは/etc/aws.confファイルに保存された設定情報を利用します。

/etc/aws.confファイルに、Security Credentialsで表示されるAccess Key IDとSecret Access Key、及びAccount Numberを、以下の書式で記述します。

; AWS Security Credentials
; Access Key ID
access_key = "06224BHAZ75910F2"
; Secret Access Key
secret_key = "aIfbA2568+12TEqLDYpiqOyRULvi9"
; Account Number
account_id = "123412341234"

さらに/etc/aws.confファイルに、チュートリアルのPHPスクリプトが作成するファイルを保存するディレクトリのパスを、以下の書式で追記しておきます。

; Path to writable directory where we can save files
tutorial_file_path = "/tmp"

接続の確認

チュートリアルの最初に登場するPHPスクリプトは、avail-zones.phpです。このスクリプトは、EC2のゾーンの利用可否を問い合せるDescribeAvailabilityZonesリクエストを発行します。

$ php avail-zones.php
<?xml version="1.0"?>
<DescribeAvailabilityZonesResponse xmlns="http://ec2.amazonaws.com/doc/2008-05-05/">
...

このスクリプトは最もプリミティブなRESTリクエストの作成例で、外部ライブラリに依存せずにURLをいちから組み立てています。そのため、スクリプトの実行で、/etc/aws.confファイルに記述したSecurity Credentialsの正当性が確認できるとともに、そのソースを読み解くことで、RESTリクエストのURLの構成、特にその署名(Signature)の作成方法が把握できるようになっています。

SOAPリクエスト

すべてのAWSはRESTとSOAPの両インタフェースで利用できます。チュートリアルは基本的にRESTを利用しますが、一部のスクリプトにはそのSOAP版も用意されています。

SOAPリクエストではX.509 Certificateが必要になります。Security CredentialsでX.509 Certificateを設定後、/etc/aws.confファイルに、cert-....pemファイルとpk-....pemファイルのパスを以下の書式で追記します。SOAPを利用しない場合は、この手順は不要です。

; X.509 Certificate Path
cert_file = "/path/to/my/cert-....pem"
; RSA private key 
private_key_file = "/path/to/my/pk-....pem"

avail-zones-soap.phpは、avail-zones.phpのSOAP版です。

$ php avail-zones-soap.php 
us-east-1a: available
...

これ以降に登場するチュートリアルのPHPスクリプトはその冒頭でexample_setup.phpをインクルードしています。このexample_setup.phpは、/etc/aws.confファイルから設定情報を読み込み、あわせて各スクリプトが利用するクラスライブラリ用のオートロードを定義しています。

EC2インスタンスの起動

初めてチュートリアルに取り組む際は、実際にEC2インスタンスを起動する前に、まずec2-prelaunch.phpを実行して、キーペアの作成とセキュリティグループの設定を行います。

ec2-prelaunch.php

  1. DescribeKeyPairsリクエストで「awstutorial」キーペアの存在を確認
  2. キーペアが存在しない場合、CreateKeyPairリクエストでキーペアを作成し、プライベートキーを、/etc/aws.confファイルの「tutorial_file_path」で設定したディレクトリの「id_rsa-awstutorial」ファイルに保存
  3. DescribeSecurityGroupsリクエストで「awstutorial」セキュリティグループの存在を確認
  4. グループが存在しない場合、CreateSecurityGroupリクエストでグループを作成
  5. グループの設定でポート80とポート22が開放されていない場合、AuthorizeSecurityGroupIngressリクエストでポートを開放
$ php ec2-prelaunch.php 
Creating awstutorial keypair...
generated fingerprint
f3:e4:e6:c8:92:dd:f1:52:be:ea:a3:9d:75:57:ba:65:61:a7:a3:28
generated material
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
Creating awstutorial security group ...done.
Opening awstutorial port 80 ...done.
Opening awstutorial port 22 ...done.

ec2-launch.phpを実行すると実際にEC2インスタンスが起動します。

ec2-launch.php

  1. RunInstancesリクエストで、ID「ami-2b5fba42」のAMI(Fedora Core 8)のインスタンスを起動し、そのインスタンスIDを、/etc/aws.confファイルの「tutorial_file_path」で設定したディレクトリの「awstutorial-instance.txt」ファイルに保存
  2. パブリックDNS名(ホスト名)が割り振られるまで、DescribeInstancesリクエストを定期的に実行し、パブリックDNS名が割り振られたらそれを、/etc/aws.confファイルの「tutorial_file_path」で設定したディレクトリの「awstutorial-hostname.txt」ファイルに保存
$ php ec2-launch.php 
Launching awstutorial instance.
i-b98db8d1 is pending
Waiting for public hostname...........................
i-b98da8d1 is running at ec2-75-101-188-56.compute-1.amazonaws.com
Instance booted in 76.150985002518 seconds.

EC2インスタンスの設定

/etc/aws.confファイルの「tutorial_file_path」で設定したディレクトリに移動し、ec2-prelaunch.phpスクリプトとec2-launch.phpスクリプトの実行によって保存されたファイルを使って、必要な環境変数を設定します。

$ cd /tmp
$ export AWSTUTORIAL_HOST=`cat \`pwd\`/awstutorial-hostname.txt`
$ export AWSTUTORIAL_KEY=`pwd`/id_rsa-awstutorial

/etc/aws.confファイルをEC2インスタンスにアップロードし、インスタンス上でチュートリアルのスクリプトを実行する環境を整えます。

$ scp -i $AWSTUTORIAL_KEY /etc/aws.conf root@$AWSTUTORIAL_HOST:/etc/aws.conf
$ ssh -i $AWSTUTORIAL_KEY root@$AWSTUTORIAL_HOST \
    'curl -O http://s3.killersoft.com/AWSforPHP/awsfiles.zip; \
    unzip awsfiles.zip -d /var/www/'
$ scp -i $AWSTUTORIAL_KEY awstutorial-*.txt root@$AWSTUTORIAL_HOST:/tmp/

インスタンスにSSHログインします。

$ ssh -2 -i $AWSTUTORIAL_KEY root@$AWSTUTORIAL_HOST

インスタンス上で、PHPとApacheのインストールを行います。

# yum -y install php \
    php-mcrypt.i386 \
    php-soap.i386 \
    php-xml.i386 \
    php-cli.i386 \
    httpd.i386

インスタンス上で、チュートリアルファイルのindex.phpをドキュメントルートにコピーし、アップロードされたビデオファイルを保存する/var/www/html/uploadsディレクトリを作成して、Apacheを起動します。

# cp /var/www/awsfiles/index.php /var/www/html/index.php
# mkdir /var/www/html/uploads
# chown apache:apache /var/www/html/uploads
# service httpd start

インスタンスのApacheの起動後に、ローカルコンピュータのウェブブラウザで、インスタンスのパブリックDNS名にアクセスすると、ファイルアップロードフォームが表示されます。インスタンスのパブリックDNS名は、/etc/aws.confファイルの「tutorial_file_path」で設定したディレクトリの「awstutorial-hostname.txt」ファイルに保存されています(もちろんAWS Consoleでも確認できます)。

ファイルアップロードフォームから適当なファイルをアップロードすると、インスタンスの/var/www/html/uploadsディレクトリにファイルが保存されます。現在のindex.phpが行うのはこの単純なファイルアップロード処理だけです。チュートリアルのシナリオでは、アップロードされたファイルはS3に保存され、そのパスがSQSに登録されて変換処理を待ち受けますが、現在のindex.phpは、まだそうした処理は行いません。

そこで次に、SQSにキューを作成し、index.phpを差し替えます。

SQSキューの作成

EC2インスタンス上で、sqs-makequeue.phpを実行して「awstutorial」という名前のキューを作成します。

sqs-makequeue.php

  1. ListQueuesリクエストで、名前が「awstutorial」で始まるキューの存在を確認
  2. キューが存在しない場合、CreateQueueリクエストでキューを作成
# php /var/www/awsfiles/sqs-makequeue.php 
Creating awstutorial...
Queue awstutorial created at https://queue.amazonaws.com/842929249205/awstutorial

アップロードファイルのS3への転送とSQSキューへのメッセージ送信

EC2インスタンス上で、現在のindex.phpをチュートリアルファイルのindex2.phpと差し替えます。

# cp /var/www/awsfiles/index2.php /var/www/html/index.php

新しいindex.phpはファイルアップロード処理の完了後にsqs-queue-conversion.phpをインクルードします。sqs-queue-conversion.phpは、アップロードされたファイルをS3に転送し、そのパスをメッセージとしてキューに送信します。

sqs-queue-conversion.php

  1. アップロードされたファイルをS3に転送
  2. SendMessageリクエストで、S3に転送したファイルのパスをメッセージとして「awstutorial」キューに送信

チュートリアルでは、S3の操作は、チュートリアルの著者であるClay Lovelessさん自身が開発したKillersoft_Wrapper_S3クラスを利用します。Killersoft_Wrapper_S3はS3に対するストリームラッパーの実装で、対応のファイルシステム関数などで、「s3://〜」というURLでS3のオブジェクトを操作できるようにするものです。

以下はsqs-queue-conversion.php中でKillersoft_Wrapper_S3を使用している箇所の抜粋で、Killersoft_Wrapper_S3::selfRegisterメソッドでラッパーを登録することで、is_dir、mkdir、file_put_contentsといったお馴染みの関数で、S3オブジェクトの操作が行われています。

Killersoft_Wrapper_S3::selfRegister();
...
$bucket = 's3://awstutorial-'
        . md5(
            $creds['access_key'] .
            $creds['secret_key'] .
            $host
        );

if (! is_dir($bucket)) {
    mkdir($bucket);
}
...
file_put_contents(
    "{$bucket}/{$upload_name}",
    file_get_contents($upload_file)
);

なお、チュートリアルでは、アップロードされたファイルはそのオリジナルのファイル名のままで保存されます。当然、同じ名前のファイルがアップロードされると同名のファイルが上書きされてしまうため、実用に供する場合はユニークなファイル名を割り当てる処理を追加する必要がありますが、チュートリアルではそうした処理は端折られています。

キューの確認

キューの状態はjob-check.phpを実行することで確認できます。

job-check.php

  1. S3に転送したファイルの存在確認
  2. GetQueueAttributesリクエストでキューにある可視メッセージの大凡の数(ApproximateNumberOfMessages)を取得して表示
  3. ReceiveMessageリクエストでキューにあるメッセージを受信してそのメッセージボディを表示(メッセージを確認するだけなので、他のプロセスの受信を妨げないようにVisibilityTimeoutは最小限に設定)
# php /var/www/awsfiles/job-check.php 
s3://awstutorial-a136e5e1e1e3ce3c44ffb1affbe79f1d/sample.mov is on S3!
Queue awstutorial has ~1 messages.
Found a message with a body of:
s3://awstutorial-a136e5e1e1e3ce3c44ffb1affbe79f1d/sample.mov

キューからのメッセージの受信と削除

チュートリアルでは、アップロードされたファイルはFLV形式に変換されます。変換処理を担当するプロセスはキューを監視し、新しいメッセージを受信すると変換処理を実施します。job-fetch.phpはこうしたプログラムの例です。

job-fetch.php

  1. ReceiveMessageリクエストでキューにあるメッセージを受信(VisibilityTimeoutは20秒に設定)
  2. メッセージのパスがS3上に実在するか確認
  3. パスが実在しない場合、DeleteMessageリクエストでメッセージを削除して終了
  4. パスが実在する場合、S3からファイルを転送して変換処理を実施
  5. 変換処理が成功したら(変換後のファイルが存在していたら)DeleteMessageリクエストでメッセージを削除
  6. 変換後のファイルをS3に転送し、変換元のファイルを削除
# php /var/www/awsfiles/job-fetch.php
Conversion complete!
Deleting completed job from queue.
Uploading converted file back to S3
Deleting original since we no longer need it

メッセージの受信時にVisibilityTimeoutで設定した秒数を経過すると、(メッセージが削除されていない場合)そのメッセージは再び可視状態となり、他のクライアントが受信可能になります。そこで実際のVisibilityTimeoutの設定は、複数のクライアントが重複してメッセージを受信しないように調整する必要があります。

なお、job-fetch.phpはビデオの変換にFFmpegを利用します。従ってjob-fetch.phpを実行するコンピュータにはFFmpegが必要で、チュートリアルの「Step 3: Perform Conversion Job」にはEC2インスタンスへのFFmpegのインストール手順が紹介されています。しかし、FFmpegのインストールや実行はチュートリアルの本旨ではなく、実際のところFFmpegのインストールは結構な手間なので、インストールや変換がうまくいかない場合は、job-fetch.phpのFFmpegの実行コマンドを編成している箇所を、以下のように適当に改変して対処してしまってください。

// ffmpeg command for transformation
// $cmd = '/usr/bin/ffmpeg -i '
//      . escapeshellcmd($localin)
//      . ' -ar 22050 '
//      . '-acodec mp3 -ab 32k -r 25 -s 320x240 '
//      . '-vcodec flv -qscale 9.5 '
//      . escapeshellcmd($localout);
$cmd = sprintf('cp %s %s',
        escapeshellcmd($localin),
        escapeshellcmd($localout));

SimpleDBによるビデオデータベース

チュートリアルでは、変換処理が完了した各ビデオは、そのデータが以下のような構造のSimpleDBデータベースに登録されます。

Item Name userid category file description size tags
item1 clay tutorials sample.mov Just a sample video. Watch! 71k apple

本来こうしたデータの登録は、ファイルのアップロードや変換処理の完了にあわせて行われるべきものですが、チュートリアルでは別途に手動で(!)行われます。さらにチュートリアルでは、リストを表示したりビデオを再生するウェブインタフェースは結局用意されません(つまりこのサイトのユーザは、アップロードしたビデオを見ることはできません)。もちろん、そのあたりはチュートリアルの本旨ではないのですが、まあとにかくバッサリ端折られてますんで、あらかじめご了解ください。

ドメインの作成

SimpleDBでは、RDBMSのテーブルに相当する概念を「ドメイン」と呼びます。sdb-create-domain.phpを実行すると、「awstutorial」という名前のドメインが作成されます。

sdb-create-domain.php

  1. CreateDomainリクエストで「awstutorial」という名前のドメインを作成
# php sdb-create-domain.php 
RequestId: 897b7cba-e9c0-1f11-9531-275dcf846e9b
BoxUsage: 0.0055590278

SimpleDBへのリクエストのレスポンスには、その利用料金の指標となる「Box Usage」の値が含まれます。

EC2では同時に起動可能なインスタンス数はデフォルトで20ヶに制限されていますが、SimpleDBにも同様の制限があり、デフォルトではドメイン数は100ヶまで、1ドメインあたりのデータ量は10GBまでに制限されています。そして、EC2と同様にリクエストベースでこの制限を緩和することが可能です。

ドメインの一覧

sdb-list-domains.phpを実行すると、作成したドメインの一覧を確認できます。

sdb-list-domains.php

  1. ListDomainsリクエストでドメインの一覧を取得
# php sdb-list-domains.php 
DomainName awstutorial

アイテムの追加

sdb-create-records.phpを実行してアイテム(レコード)を追加します。追加されるアイテムは、上表の「item1」のものです。

sdb-create-records.php

  1. PutAttributesリクエストで「awstutorial」ドメインに「item1」という名前のアイテム、及びその属性(各カラム値)を保存
# php sdb-create-records.php 
RequestId: ee265eb4-0924-684a-b261-7cec5030ff23
BoxUsage: 0.0000220339

1アイテムあたりの属性数は256ヶ以下、1ドメインあたりの属性数は10億ヶ以下に制限されています。

SELECTクエリーの実行

SimpleDBでは、限定的なSELECT文を用いてアイテムを検索することができます。sdb-sqlselect.phpは、tags属性値が「app」で始まるアイテムを検索する「SELECT * FROM awstutorial WHERE tags LIKE 'app%'」を実行します。

sdb-sqlselect.php

  1. Selectリクエストで「SELECT * FROM awstutorial WHERE tags LIKE 'app%'」を実行
# php sdb-sqlselect.php 
Item Name: item1
file: sample.mov
userid: clay
size: 71k
tags: apple
category: tutorials
description: Just a sample video. Watch!

利用可能なSELECT文の詳細は、Using Select to Create Amazon SimpleDB Queriesに記載されています。

1度のリクエストで取得可能なアイテムは2,500件以下、または合計データ量が1MB以下に制限されています。リクエストがこの制限を超えるアイテムにマッチした場合(及びクエリーの実行が5秒以上経過した場合)はレスポンスにNextToken要素が含まれ、その値を用いることで「次ページ」のリクエストが行えます。

チュートリアルのsdb-list-items.phpでは、Selectリクエストではなく、Queryリクエスト、及びQueryWithAttributesリクエストが行われていますが、これらはいずれも最新のAPIバージョン2009-04-15ではDeprecatedとなっています。

チュートリアルの紹介は以上です。チュートリアルではAmazon純正のライブラリを利用していましたが、AWSのライブラリには他にも様々なものがあり、以下ではそのひとつ、CloudFusionを紹介します。


CloudFusion(旧称Tarzan AWS)

CloudFusionはAWS等のクラウドサービス用のPHPライブラリです。CloudFusionは、AWSについては単一のパッケージで複数のサービスをサポートしており、現時点のバージョン2.5では、EC2、S3、SQS、SimpleDB、CloudFront、及びProduct Advertising APIをサポートしています。またAWS以外にも、クラウドサービスの基盤を提供するオープンソースソフトウェアであるEucalyptusをサポートしています。

CloudFusionは以前は「Tarzan AWS」という名称でしたが、2010年1月にリリースされた、Eucalyptusのサポートが追加されたバージョン2.5から、現在の名称に変更されました。このセクションは当初Tarzan AWSについてのものでしたが、CloudFusion 2.5のリリースに伴ない全面的に改訂しました。

以下はチュートリアルの「sdb-create-records.php」にある、SimpleDBのドメイン「awstutorial」にアイテム「item1」を追加するコードをCloudFusionのもので書き換えた例です。

require_once 'cloudfusion.class.php';

$sdb = new AmazonSDB(
        'Your AWS Access Key ID',
        'Your AWS Secret Access Key');

$response = $sdb->put_attributes('awstutorial',
        'item1',
        array(
            'userid'      =>  'clay',
            'category'    => 'tutorials',
            'file'        => 'sample.mov',
            'description' => 'Just a sample video. Watch!',
            'size'        => '71k',
            'tags'        => array('apple')),
        true);
print_r($response);

なお、上の例ではAccess Key IDとSecret Access Keyをコンストラクタのパラメータに指定していますが、これらはCloudFusionでは通常config.inc.phpに記述しておきます。これ以降に登場する例はいずれも、これらがconfig.inc.phpに記述されていることを前提に、コンストラクタのパラメータは省略しています。

CloudFusionには以下のような特徴があります。

リクエストの並列実行

CloudFusionではcurl_multi_*によるリクエストの並列実行が可能です。

以下は通常の、逐次リクエストを実行する例です。ここではSQSキューに10ヶのメッセージを送信しています。AmazonSQS->send_messageメソッドは直ちにリクエストを実行し、レスポンスオブジェクトを返します。

require_once 'cloudfusion.class.php';

$sqs = new AmazonSQS;
$responses = array();
for ($i = 0; $i < 10; $i++) {
    $responses[] = $sqs->send_message(
            'https://queue.amazonaws.com/awstutorial',
            "This is message #$i");
}
print_r($responses);

以下は上の例を、リクエストを並列実行するように書き換えたものです。CloudFusionのAmazon*クラスの多くのメソッドは、パラメータの最後にTRUEを指定すると、リクエストを実行してレスポンスオブジェクトを返す代わりに、リクエストのcURLハンドルを返します。ハンドルの配列をRequestCore->send_multi_requestのパラメータに指定するとリクエストが並列実行され、その各レスポンスオブジェクトの配列が返されます。

require_once 'cloudfusion.class.php';

$sqs = new AmazonSQS;
$handles = array();
for ($i = 0; $i < 10; $i++) {
    $handles[] = $sqs->send_message(
            'https://queue.amazonaws.com/awstutorial',
            "This is message #$i",
            true);
}
$request = new RequestCore;
$responses = $request->send_multi_request($handles);
print_r($responses);

組み込みのキャッシュ機構

CloudFusionにはレスポンスのキャッシュ機構が用意されており、必要に応じて利用することができます。現在対応しているキャッシュストレージは、ファイル、SQLite、MySQL、PostgreSQL、APC、及びMemcacheとなっています。

容易なクラスのカスタマイズ

CloudFusionでは、通常内部的に使われるクラスについても容易にそのカスタムクラスが利用出来るようになっています。以下は例として、リクエストURLを返すgetRequestUrlメソッドを実装したResponseCoreの継承クラスを作成しています。カスタムクラスを利用するには、Amazon*クラスのset_*_classメソッドのパラメータにカスタムクラスの名前を指定します。

require_once 'cloudfusion.class.php';

class CFCustomResponse extends ResponseCore {
    public function getRequestUrl() {
        if (isset($this->header['x-cloudfusion-requesturl'])) {
            return $this->header['x-cloudfusion-requesturl'];
        }   
        return null;
    }   
}

$sqs = new AmazonSQS;
$sqs->set_response_class('CFCustomResponse');
$response = $sqs->send_message(
        'https://queue.amazonaws.com/awstutorial',
        "This is another test message.");
echo $response->getRequestUrl() . "\n";

カスタムクラスはCloudFusionの命名規則に従ったファイル名を与えることで、CloudFusionのオートロードの対象になります。現在のCloudFusionのクラスファイルの命名規則は、クラス名が「Amazon」で始まる場合はそれを除去し、「CF」で始まる場合はそれをアンダースコアに置換し、クラス名をすべて小文字にして「.class.php」を続けるというものです。例えば上の例の「CFCustomResponse」クラスの場合、そのファイル名は「_customresponse.class.php」となります。

ドキュメント

CloudFusionのドキュメントは比較的よく整備されており、APIリファレンスには、多くのメソッドにサンプルコードが用意されています。

以上、AWS用のライブラリの例としてCloudFusionを紹介しました。AWS用のライブラリには、このCloudFusionや、チュートリアルで登場したKillersoft_Wrapper_S3のように、Amazon純正のもの以外にも様々なものがあり、プロジェクトのニーズ次第では検討の余地があるのかもしれません。

ウノウでは特に最近、積極的にエンジニアを採用しています。
採用ページをご覧になり興味のある方、ぜひご応募ください!!
Find Job!でも募集開始してます!

2009年12月24日

ありえるえりあ勉強会@五反田~テスト編~のご案内
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは。中村です。

アリエル・ネットワークに友人がいるきっかけで、ありえるえりあ勉強会にウノウが参加することになりました。個人的にですが、アリエルさんといえばFirefoxの拡張を作成しているときにFirefox拡張機能(extension)の作り方という記事でとてもお世話になりました。

今回のテーマはテストということで、ウノウからはテスト番長山本がスピーカーとして参加します。

発表予定内容は次のようになっています(告知文より抜粋のため敬称略)。

  • 山本番長【絶版プレミア本に学ぶウェブアプリのテスト方法】
    • テストの書籍や資料を探すとウェブアプリを対象にしたものは少ないのが現状です。絶版のため高値になっている良書「インターネットアプリケーションのためのソフトウェアテスト」の内容を辿りながら、ウェブアプリのテスト法全般について日本の状況を交えながらお話したいと思います。
  • 佐藤【rhino on junit】
    • JavaによるJavaScript処理系であるMozilla Rhino上で、JUnitを用いてJavaScriptのユニットテストを行う手法や Javaのクラスを対象にしたテストケースをJavaScriptで記述する手法などを紹介します。

開催は来年になりますが、年始の忙しさから少し落ち着く時期ではないかと思いますので、ご興味のある方は下記ATNDから是非参加登録ください。

  • 日時: 2010年1月29日(金) 19:00~21:30
  • 定員: 30人
  • 会場: ウィン五反田ビル6F (株)ワークスソリューションズ (東京都品川区西五反田1-30-3)
  • 備考: 勉強会のあと、ピザパーティー(無料)があります。
  • 参加登録: ありえるえりあ勉強会@五反田~テスト編~ : ATND

2009年12月17日

Q4Mを触ってみる
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

yukiです。そろそろクリスマスですね。みんな浮かれていればいいと思います!最近急に目が悪くなって、ツリーの赤色電球と居酒屋の赤提灯の色が判別出来なくなってきました。嘘です。

今回は、みんな大好きメッセージキュー、Q4Mを触ってみた感想を今更ながらレポートします。

ウノウでは特に最近、積極的にエンジニアを採用しています。
採用ページをご覧になり興味のある方、ぜひご応募ください!!
Find Job!でも募集開始してます!

Q4M

公式ページはこちらhttp://q4m.31tools.com/

Q4Mはサイボウズラボの奥 一穂氏が開発されており、MySQLの5.1以上でストレージエンジンとして利用できるメッセージキューで、MySQLプラグインとしてGPLライセンスで配布されております。

特長

MySQLのストレージエンジンとして利用できるので、テーブル作成時にストレージエンジンを指定するだけで利用できます。

CREATE TABLE hoge (
     ...
 ) ENGINE = QUEUE

キューの作成(enqueue)は通常のレコード操作と同様にINSERTで行い、キューの取り出し(dequeue)も同様にSELECTで行えるので、シンプルに扱う事が出来ます。

導入事例

公式ページには導入事例として以下の2つが載っています。

インストール

最新版は0.8.9となっています。こちらからバイナリ・ソース版と用意されているので、適切なものを選んでインストールします。

GCCのバージョンによってはコンパイルに失敗するエラーがありましたが、現バージョンでは解消されて手軽にインストールできるようになりました。

インストールが終わると、MySQLにプラグインとして認識されているのがわかります。

mysql> show plugins;
+------------+----------+----------------+--------------------+---------+
| Name       | Status   | Type           | Library            | License |
+------------+----------+----------------+--------------------+---------+
| binlog     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| partition  | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| ARCHIVE    | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| BLACKHOLE  | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| CSV        | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| FEDERATED  | DISABLED | STORAGE ENGINE | NULL               | GPL     |
| MEMORY     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| InnoDB     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| MyISAM     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| MRG_MYISAM | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| QUEUE      | ACTIVE   | STORAGE ENGINE | libqueue_engine.so | GPL     |
+------------+----------+----------------+--------------------+---------+

実際に動かしてみる

まずはテーブルを作成します。

mysql> CREATE TABLE queue_table (
  message TEXT NOT NULL,
  priority TINYINT UNSIGNED NOT NULL DEFAULT 10
)
ENGINE = QUEUE

次に、実際に処理するキューを作るため、キューをINSERTします。

mysql> INSERT INTO queue_table (message) VALUES ('ms1'), ('ms2') ,('ms3');

dequeueしてみます。dequeueにはqueue_waitというfunctionを利用します。

mysql> SELECT queue_wait('queue_table');
+---------------------------+
| queue_wait('queue_table') |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

成功すると、結果として1が返って来ます。
キューを取り出しているこの状態をオーナーモードと呼び、この状態だと、該当のテーブルからは1レコードだけ引けるようになります。

mysql> SELECT * FROM queue_table;
+---------+----------+
| message | priority |
+---------+----------+
| ms1     |       10 |
+---------+----------+
1 row in set (0.00 sec)

取り出して処理が完了した場合、queue_endを呼ぶと、取り出したキューが削除されます。同時にオーナーモードが解除され、非オーナーモードに戻ります。

mysql> SELECT queue_end();
+-------------+
| queue_end() |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

非オーナーモードに戻ったので、通常のSELECTを行うと、残りの全キューを引くことができます。
ただし、別のコネクションでオーナーモードになっている場合、そのコネクションで得たキューは表示されません。(後述。)

mysql> SELECT * FROM queue_table;
 +---------+----------+
 | message | priority |
 +---------+----------+
 | ms2     |       10 |
 | ms3     |       10 |
 +---------+----------+
 2 rows in set (0.00 sec)

またこのとき、処理中に例外エラーなどでキューを戻したい場合は、queue_abort()を利用すると直前に取り出したキューを戻します。queue_wait()→queue_abort()した際の流れです。

mysql> SELECT queue_wait('queue_table');
+---------------------------+
| queue_wait('queue_table') |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM queue_table;
+---------+----------+
| message | priority |
+---------+----------+
| ms2     |       10 |
+---------+----------+
1 row in set (0.00 sec)

mysql> SELECT queue_abort();
+---------------+
| queue_abort() |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM queue_table;
+---------+----------+
| message | priority |
+---------+----------+
| ms2     |       10 |
| ms3     |       10 |
+---------+----------+
2 rows in set (0.00 sec)

オーナーモードと非オーナーモード

queue_wait()を呼ぶとオーナーモードに入り、先述したように、そのコネクション内では1行のみ取得できるようになります。
また、別のコネクションでは、他コネクションでオーナーモードで取得した行以外を取得できるようになります。

コネクション1

% mysql -u test test
mysql> SELECT * FROM queue_table;
+---------+----------+
| message | priority |
+---------+----------+
| ms2     |       10 |
| ms3     |       10 |
+---------+----------+
2 rows in set (0.01 sec)

コネクション2

% mysql -u test test
mysql> SELECT * FROM queue_table;
+---------+----------+
| message | priority |
+---------+----------+
| ms2     |       10 |
| ms3     |       10 |
+---------+----------+
2 rows in set (0.01 sec)

コネクション1でオーナーモードに入る

mysql> SELECT queue_wait('queue_table');
+---------------------------+
| queue_wait('queue_table') |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM queue_table;
+---------+----------+
| message | priority |
+---------+----------+
| ms2     |       10 |
+---------+----------+
1 row in set (0.00 sec)
コネクション2でキューを全件表示すると、コネクション1で引いたキューは表示されない。
mysql> SELECT * FROM queue_table;
+---------+----------+
| message | priority |
+---------+----------+
| ms3     |       10 |
+---------+----------+
1 row in set (0.00 sec)

優先度別キュー取出

優先度低めのキューテーブルを作り、優先して取得したい順にqueue_waitの引数に加えます。

mysql> CREATE TABLE low_priority_queue (
   message TEXT NOT NULL,
   priority TINYINT UNSIGNED NOT NULL DEFAULT 10
 )
 ENGINE = QUEUE;

mysql> INSERT INTO low_priority_queue (message) VALUES ('lm1'), ('lm2'), ('lm3');

mysql> SELECT queue_wait('queue_table', 'low_priority_queue');
+-------------------------------------------------+
| queue_wait('queue_table', 'low_priority_queue') |
+-------------------------------------------------+
|                                               1 |
+-------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

成功すると、取得できるテーブルの順の番号が返って来ます。(上記は1なのでqueue_table、2であればlow_priority_queueになります)あとは通常通り取得します。

mysql> SELECT * FROM queue_table;
+---------+----------+
| message | priority |
+---------+----------+
| ms2     |       10 |
+---------+----------+
1 row in set (0.00 sec)

ここの挙動がよくわかりにくく、どなたか分かる方がいたら教えて頂ければ大変嬉しいのですが、優先度が高いテーブル(queue_table)の中身が空の時、タイムアウトを指定しないでqueue_waitすると「ゼロ」(データ無し)と返って来ます。

2009/12/21追記: 複数指定する場合は、必ずタイムアウト引数を付けなくてはいけないので、この用法は間違いでした。お詫びいたします。

mysql> TRUNCATE queue_table;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT queue_wait('queue_table', 'low_priority_queue');
+-------------------------------------------------+
| queue_wait('queue_table', 'low_priority_queue') |
+-------------------------------------------------+
|                                               0 |
+-------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

タイムアウトを与えてやると、正しく取得できます。下記の場合はqueue_tableにレコードがないので、low_priority_queueから取得するため2番が返り、期待通りの動作となります。

mysql> SELECT queue_wait('queue_table', 'low_priority_queue', 10);
+-----------------------------------------------------+
| queue_wait('queue_table', 'low_priority_queue', 10) |
+-----------------------------------------------------+
|                                                   2 |
+-----------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM low_priority_queue;
+---------+----------+
| message | priority |
+---------+----------+
| lm1     |       10 |
+---------+----------+
1 row in set (0.00 sec)

条件付き取り出し

簡易なWHERE句のようにして取得することが可能です。queue_waitのテーブルを指定する引数に、条件を付加して取得します。
下記の例は優先度2で新たなキューを発行し、優先度3以下で取得するようにしてみます。

mysql> INSERT INTO queue_table(message, priority) values ('blocker', 2);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM queue_table;
+---------+----------+
| message | priority |
+---------+----------+
| ms1     |       10 |
| ms2     |       10 |
| ms3     |       10 |
| blocker |        2 |
+---------+----------+
4 rows in set (0.00 sec)

mysql> SELECT queue_wait('queue_table:priority<3');

mysql> SELECT * FROM queue_table;
+---------+----------+
| message | priority |
+---------+----------+
| blocker |        2 |
+---------+----------+
1 row in set (0.00 sec)

リレー

別のサーバにキューをリレーする事が出来ます。同梱されているq4m-forwardというperlスクリプトを起動すると、無限ループでキューを待ち、別のサーバへ転送するような処理になっています。
同様の処理であれば、自作のスクリプトで同様の処理が可能です。
daemontoolsなどを使えば、割とお手軽に転送させることが出来るかと思います。

まとめ

いかがでしたでしょうか。メッセージキューイングというとActiveMQやTheSchwartzなど、いろいろなソリューションがあると思いますが、キューイング方法などかなり手軽に扱えるので、1度試してみてはいかがでしょうか。

試している最中、queue_wait()してオーナーモード中にtruncateしてしまい、drop databaseすら効かなくなってrm -r /var/lib/mysql/testしたりしましたが、ご愛敬ということで。

SaaS提供の高性能CMS RCMS
SaaS提供の高性能CMS

  [PR] 転職
ウノウラボはウノウ株式会社のエンジニア/デザイナーによる大小のアウトプットを行っていく場です。

現在ウノウは絶賛人材募集中です。詳細は求人ページへ。

著者一覧

YAMADA shintaro yamamoto keita Sakatoku yamaoka yuki isogawa cloned uchida ishikawa chihiro

デモサービス

ライブラリなど

ライセンスについて

ウノウラボで配布しているソースコードのご利用につきましては、基本的に修正BSDライセンスに従うものとします。 それ以外のライセンスを指定させていただく場合は記事中で個別に記載いたします。

ウノウサービス

最近のトラックバック

Powered by
Movable Type 4.261