Q4M (Queue for MySQL) 將佇列語意內建為儲存引擎,支援 INSERT/DELETE、阻塞讀取、Owner 模式等特性,適合輕量級非同步任務處理。本文記錄在 MySQL 5.1.48 上安裝與基本操作。
support-files/q4m-forward → $MYSQL_HOME/bin/libqueue_engine.so → $MYSQL_HOME/lib/mysql/plugin/support-files/install.sql):
INSTALL PLUGIN queue SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_wait RETURNS INT SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_end RETURNS INT SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_abort RETURNS INT SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_rowid RETURNS INT SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_set_srcid RETURNS INT SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_compact RETURNS INT SONAME 'libqueue_engine.so';
SHOW PLUGINS; 確認 QUEUE 狀態為 ACTIVE-- 建立 QUEUE 表(不支援主鍵、索引、UPDATE)
CREATE TABLE t1 (a INT, b VARCHAR(100)) ENGINE=QUEUE;
-- 插入(需關閉 binlog,否則報 Binary logging not possible)
INSERT INTO t1 VALUES (1, 'sd'), (2, 'sda'), (3, 'fio');
SELECT COUNT(*) 極快(內部計數器)| 模式 | 說明 | 切換函數 |
|---|---|---|
| Non-Owner (預設) | 可見所有佇列資料 | — |
| Owner | 獨佔一行資料,其他連線不可見 | queue_wait() 進入,queue_end()/queue_abort() 退出 |
-- 等待 t1 一行資料(預設 60 秒超時)
SELECT * FROM t1 WHERE queue_wait('t1');
-- 等待條件 a < 4 的行
SELECT * FROM t1 WHERE queue_wait('t1: a<4');
-- 多表輪詢,30 秒超時,返回 1=t1, 2=t2, 0=timeout
SELECT queue_wait('t1', 't2', 30);
-- 刪除並釋放(正常消費)
SELECT queue_end();
-- 僅釋放不刪除(重回佇列)
SELECT queue_abort();
-- 連線斷開等同 queue_abort()
queue_rowid():取得目前擁有行的 64-bit Row IDqueue_set_srcid(src_tbl_id, mode, src_row_id):檢查來源表 Row ID 是否已匯入,mode='a' 刪除重複,mode='w' 重置Q4M 以儲存引擎形式實作佇列,極度輕量、零外部依賴,適合嵌入式、中小型專案的非同步解耦需求。