PostgreSQL で簡易に MQ - Mi manca qualche giovedi`? ãèªãã§ããããç´ æ´ãããã¨æã£ãã®ã§ Perl ã¢ã¸ã¥ã¼ã«åãã¾ããã
simple message queue using PostgreSQL.
http://github.com/fujiwara/perl-queue-q4pg-lite/tree/master
å²ã¨ç°¡æ㪠Message Queue ã¨ãããã¨ã§ãLite ã£ã¦ååã«ãpg_advisory_lock() ã使ç¨ãã¦ãã®ã§ãPostgreSQL-8.2 以éã§ãªãã¨åãã¾ããã
ã¤ã³ã¿ã¼ãã§ã¼ã¹ã¯ Queue::Q4M ã¨ã»ã¨ãã©åãâ¦â¦ã¨ããããã³ã¼ãèªä½ãååããã Queue::Q4M ããé ãã¦ãã¾ãã
use Queue::Q4Pg::Lite; my $q = Queue::Q4Pg::Lite->connect( connect_info => [ 'dbi:Pg:dbname=mydb', $username, $password, ], ); for (1..10) { $q->insert($table, { col1 => "foo", col2 => "bar", col3 => "baz" }); } while ($q->next($table)) { my $cols = $q->fetch_hashref() print "col1 = $cols->{col1}, col2 = $cols->{col2}, col3 = $cols->{col3}\n"; $q->ack; }
Queue::Q4M ã¨éãã®ã¯ã以ä¸ã®ãããªã¨ããã
- next() ã§åå¾ã§ããè¡ããªãå ´åã¯ãå é¨ã§ $q->interval (default: 5) ç§ sleep ãã¦å度 SELECT ãã¦ãã
- fetch_array, fetch_arrayref ããªããfetch_hashref ã®ã¿
- åãåºããè¡ã®å¦çãå®äºããã $q->ack ãå®è¡ããå¿ è¦ããã (å®è¡ããªãã¨è¡ãæ¶ããªã)
ä¾åã¢ã¸ã¥ã¼ã«ã¯ AnyMoose, DBI, DBD::Pg, SQL::Abstract ãããã§ãã
insert() ã¯ç¹ã«ãã®ã¢ã¸ã¥ã¼ã«ã使ãå¿ è¦ã¯ãªãã¦ãæ®éã« INSERT ãã¦æ§ãã¾ããããªã®ã§ Queue ã«æå ¥ããã»ã (Web App ã¨ã) 㯠DBIC ã§ã CDBI ã§ãç´ ã® DBI ã§ãããªãã§ãã好ããªæ段ã§ã©ããã
ãã¼ãã«ã«å¥½ããªã«ã©ã ãä½ãã¦ããã®å¤ãæ¡ä»¶ã«ã㦠SELECT ã§ããã®ã§ãåªå
度ã 10 以ä¸ã®ãã®ããqueue æå
¥æ¥æã®æ©ãé ã«åå¾ãã¨ãããããªãã¨ãå¯è½ã§ãã
CREATE TABLE mq ( id serial primary key, message text, priority int, created_on timestamp default now() );
while ( $q->next("mq", { priority => { "<=", 10 } }) ) { }
[追è¨]
ORDER BY ãä»ããã¨ãå®éã«åå¾ããªãè¡ã«ã¤ãã¦ã lock ãæãã¦ãã¾ããå°ã£ããã¨ã«ãªãã¾ããadvisory_lock ã®è©ä¾¡ããã¹ã¦è©¦ã¿ã¦æåãããã®ã並ã¹æ¿ãã¦ãæåã® 1è¡ã®ã¿åå¾ããã®ã§ãorder ã¯æå®ã§ããªãããã«ãã¾ãã (version 0.03)ã
CPAN ã«ã upload ããã®ã§ããã®ãã¡åå¾ã§ããããã«ãªãã¨æãã¾ãã