MySQL触发器到RabbitMQ

1 投票
2 回答
6694 浏览
提问于 2025-05-01 02:50

我想找一种方法,把SQL数据库中的记录传送到RabbitMQ。

我的需求是,每当在表中插入一条新记录时,我希望把这条记录(可以是JSON格式或者其他格式)传送到RabbitMQ。

我听说可以用sys_exec()来执行外部脚本(比如Python或Java),但我想知道具体应该怎么做,以及这样做是否是最好的方法。

暂无标签

2 个回答

0

我现在正在研究类似的事情,看来MySQL的触发器可能是关键:

http://dev.mysql.com/doc/refman/5.1/en/trigger-syntax.html

我打算用这些触发器来执行一些操作,然后把信息发送到RabbitMQ。

2

ssimicro/lib_mysqludf_amqp: 直接从MySQL通过AMQP发布消息 似乎正好符合需求。

这样你就可以做到这个(从README中复制粘贴的内容):

SET @AMQP_URL = 'amqp://guest:guest@localhost:5672';
SET @AMQP_EXCHANGE = 'udf';

DROP TABLE IF EXISTS `accounts`;
CREATE TABLE `accounts` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `username` varchar(64) NOT NULL,
     PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='Customer Accounts';

DELIMITER ;;

DROP TRIGGER IF EXISTS `after_insert_on_accounts`;
CREATE DEFINER=`root`@`localhost` TRIGGER `after_insert_on_accounts` AFTER INSERT ON `accounts` FOR EACH ROW BEGIN
    SET @message_id = (SELECT lib_mysqludf_amqp_sendjson(@AMQP_URL, @AMQP_EXCHANGE, 'accounts.insert', json_object('id', NEW.id, 'username', NEW.username)));
END ;;

DROP TRIGGER IF EXISTS `after_update_on_accounts`;
CREATE DEFINER=`root`@`localhost` TRIGGER `after_update_on_accounts` AFTER UPDATE ON `accounts` FOR EACH ROW BEGIN
    SET @message_id = (SELECT lib_mysqludf_amqp_sendjson(@AMQP_URL, @AMQP_EXCHANGE, 'accounts.update', json_object('id', NEW.id, 'username', NEW.username)));
END ;;

DROP TRIGGER IF EXISTS `after_delete_on_accounts`;
CREATE DEFINER=`root`@`localhost` TRIGGER `after_delete_on_accounts` AFTER DELETE ON `accounts` FOR EACH ROW BEGIN
    SET @message_id = (SELECT lib_mysqludf_amqp_sendjson(@AMQP_URL, @AMQP_EXCHANGE, 'accounts.delete', json_object('id', OLD.id, 'username', OLD.username)));
END ;;

DELIMITER ;

INSERT INTO accounts (username) values ('jdoe');
UPDATE accounts SET username = 'jsmith';
DELETE FROM accounts WHERE id = last_insert_id();

不过我怀疑它每发送一条消息就会新开一个连接到RabbitMQ并登录,这样可能会导致性能不太好。但我不太确定。

撰写回答