MySQL触发器到RabbitMQ
我想找一种方法,把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并登录,这样可能会导致性能不太好。但我不太确定。