当前位置: 首页 > news >正文

宝盒 网站新能源汽车销量排名

宝盒 网站,新能源汽车销量排名,官方网站建设合同,wordpress 画线不显示一、简单步骤 实现Canal监控Binlog日志#xff0c;并通过消息队列进行异步处理#xff0c;步骤如下#xff1a; 配置Canal#xff1a;首先#xff0c;需要配置Canal进行Binlog日志监控。可以通过Canal的官方文档了解如何配置Canal。 连接到Canal#xff1a;使用Canal客户…一、简单步骤 实现Canal监控Binlog日志并通过消息队列进行异步处理步骤如下 配置Canal首先需要配置Canal进行Binlog日志监控。可以通过Canal的官方文档了解如何配置Canal。 连接到Canal使用Canal客户端连接到Canal服务器订阅需要监控的数据库和表。 监听Binlog事件通过Canal客户端监听Canal服务器发送的Binlog事件。可以通过设置监听器来处理不同类型的Binlog事件。 将事件发送到消息队列一旦监听到Binlog事件可以将事件转化为消息并发送到消息队列进行异步处理。可以选择使用Kafka、RabbitMQ、ActiveMQ等消息队列。 消息处理在消息队列中可以编写消费者程序来处理接收到的消息。根据消息的类型和内容可以执行相应的操作例如更新数据库生成报告等。 确保处理的幂等性在处理消息时需要注意幂等性。即同一条消息可以被处理多次但最终结果应该是一致的。 监控和错误处理在整个过程中需要监控消息队列的状态并进行错误处理。例如如果消息队列出现故障可能需要重新连接或存储未处理的消息。 二、Binlog使用 Binlog是MySQL数据库的二进制日志用于记录数据库的更改操作。它可以用于数据恢复、主从复制、数据备份和恢复等场景。以下是有关Binlog的一些常见用法 数据恢复通过分析Binlog可以还原数据库到某个特定的时间点或事务提交后的状态。这在意外删除或误操作后恢复数据非常有用。 主从复制通过将Binlog从主数据库复制到从数据库可以实现主数据库的实时同步。这可以用于横向扩展读操作、数据备份和故障恢复。 数据备份和恢复可以使用Binlog进行增量备份和恢复只记录变更的部分而不需要完全备份整个数据库。 数据审计和追踪分析Binlog可以了解数据库的操作历史包括谁在何时执行了哪些操作。这对于安全审计和数据追踪非常有用。 数据更改追踪和同步通过解析Binlog可以捕获和同步数据库的更改以便在其他系统或数据仓库中进行进一步处理和分析。 要使用Binlog首先需要在MySQL服务器上启用Binlog功能。可以在MySQL配置文件中设置以下参数 log-binmysql-bin binlog-formatROW其中log-bin指定Binlog日志文件的名称前缀binlog-format指定Binlog的格式为行格式。 启用Binlog后MySQL将开始记录所有的更新操作到Binlog中。可以使用MySQL提供的工具如mysqlbinlog来解析和分析Binlog文件。还可以使用第三方工具如Canal来实时监控和解析Binlog以便进行异步处理或其他操作。 需要注意的是Binlog日志会占用磁盘空间因此需要定期进行清理和归档以避免过多的日志文件导致磁盘空间不足。 三、canal使用 Canal是一款开源的基于Java的MySQL数据库增量订阅消费组件它可以帮助我们实时监控MySQL的Binlog日志并将数据推送到消息队列中进行异步处理。以下是使用Canal的一般步骤 下载和安装Canal首先需要从Canal的官方网站或Github上下载Canal的安装包然后解压到指定的目录中。 配置CanalCanal需要配置MySQL的相关信息如主机地址、端口、用户名、密码等以便连接到MySQL数据库。配置文件位于Canal安装目录下的conf文件夹中主要包括canal.properties和instance.properties两个文件。其中canal.properties是全局配置文件而instance.properties是实例级别的配置文件可以配置多个实例。 启动Canal Server通过运行Canal Server的启动脚本如startup.sh或startup.bat启动Canal Server进程。 创建Canal实例使用Canal提供的命令行工具或API创建一个Canal实例指定要订阅和监控的数据库和表。 消费Binlog事件通过连接到Canal Server订阅和消费Binlog事件。Canal可以将Binlog事件推送到Kafka、RocketMQ等消息队列中供后续的异步处理。 四、Rabbit结合canal更新Redis缓存示例 通过canal 监控更新 Redis 缓存或者触发RabbitMQ发送消息示例 import com.alibaba.fastjson.JSON; import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import com.alibaba.otter.canal.protocol.CanalEntry; import com.alibaba.otter.canal.protocol.Message; import com.rabbitmq.client.*; import redis.clients.jedis.Jedis;import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.Channel; import java.sql.Connection; import java.util.List;public class RabbitCanalRedisExample {private static final String RABBITMQ_QUEUE_NAME canal_redis_queue;private static final String RABBITMQ_HOST localhost;private static final int RABBITMQ_PORT 5672;private static final String CANAL_HOST localhost;private static final int CANAL_PORT 11111;private static final String REDIS_HOST localhost;private static final int REDIS_PORT 6379;public static void main(String[] args) throws Exception {// 连接 RabbitMQConnectionFactory factory new ConnectionFactory();factory.setHost(RABBITMQ_HOST);factory.setPort(RABBITMQ_PORT);Connection connection factory.newConnection();Channel channel connection.createChannel();channel.queueDeclare(RABBITMQ_QUEUE_NAME, false, false, false, null);// 连接 CanalCanalConnector connector CanalConnectors.newSingleConnector(new InetSocketAddress(CANAL_HOST, CANAL_PORT), example, , );connector.connect();connector.subscribe(.*\\..*);connector.rollback();// 连接 RedisJedis jedis new Jedis(REDIS_HOST, REDIS_PORT);while (true) {// 从 Canal 获取消息Message message connector.getWithoutAck(100);long batchId message.getId();int size message.getEntries().size();if (batchId -1 || size 0) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 确认消息已处理connector.ack(batchId);continue;}// 遍历 Canal 消息for (CanalEntry.Entry entry : message.getEntries()) {if (entry.getEntryType() ! CanalEntry.EntryType.ROWDATA) {continue;}try {// 解析 Canal 消息CanalEntry.RowChange rowChange CanalEntry.RowChange.parseFrom(entry.getStoreValue());for (CanalEntry.RowData rowData : rowChange.getRowDatasList()) {if (rowChange.getEventType() CanalEntry.EventType.INSERT) {// 处理新增数据String tableName entry.getHeader().getTableName();String key rowData.getAfterColumnsList().stream().filter(c - c.getIsKey()).findFirst().get().getValue();// 更新 Redis 缓存jedis.set(tableName _ key, JSON.toJSONString(rowData.getAfterColumnsList()));// 发送消息到 RabbitMQchannel.basicPublish(, RABBITMQ_QUEUE_NAME, null, key.getBytes());} else if (rowChange.getEventType() CanalEntry.EventType.DELETE) {// 处理删除数据String tableName entry.getHeader().getTableName();String key rowData.getBeforeColumnsList().stream().filter(c - c.getIsKey()).findFirst().get().getValue();// 删除 Redis 缓存jedis.del(tableName _ key);// 发送消息到 RabbitMQchannel.basicPublish(, RABBITMQ_QUEUE_NAME, null, key.getBytes());} else if (rowChange.getEventType() CanalEntry.EventType.UPDATE) {// 处理更新数据String tableName entry.getHeader().getTableName();String key rowData.getAfterColumnsList().stream().filter(c - c.getIsKey()).findFirst().get().getValue();// 更新 Redis 缓存jedis.set(tableName _ key, JSON.toJSONString(rowData.getAfterColumnsList()));// 发送消息到 RabbitMQchannel.basicPublish(, RABBITMQ_QUEUE_NAME, null, key.getBytes());}}} catch (IOException e) {e.printStackTrace();}}}// 确认消息已处理connector.ack(batchId);} }这个示例代码实现了以下功能 使用 Canal 连接到 MySQL 数据库并订阅所有表。使用 RabbitMQ 队列接收并发送消息。使用 Redis 缓存数据。根据 Canal 消息的类型进行相应操作新增数据时在 Redis 中保存数据并发送消息到 RabbitMQ删除数据时从 Redis 中删除数据并发送消息到 RabbitMQ更新数据时更新 Redis 中的数据并发送消息到 RabbitMQ。 区分场景也可以先发送消息通过消息触发缓存更新好处有以下几点 异步操作将更新缓存的操作写入消息队列后在实际更新缓存的过程中不会阻塞应用程序的执行。应用程序可以继续处理其他的业务逻辑而不必等待缓存更新完成。这样可以提高应用程序的响应速度和吞吐量。 并发控制通过消息队列可以实现缓存更新的并发控制。当多个请求同时更新缓存时可以通过消息队列的先进先出原则确保每个更新操作按照顺序进行避免了并发操作导致的数据不一致问题。 可靠性消息队列可以提供消息的持久化机制即使在消息队列出现故障或重启的情况下更新缓存的消息不会丢失。这样可以提高缓存更新的可靠性和数据完整性。 扩展性通过消息队列可以将缓存更新的任务分发到多个消费者进行处理实现任务的并行处理提高系统的扩展性和负载能力。 总的来说使用消息队列更新缓存可以实现异步操作、并发控制、可靠性和扩展性提高系统的性能和可靠性。
http://www.hkea.cn/news/14299052/

相关文章:

  • python做网站php青岛公交优化
  • 桂林的网站建设公司动态个人网站模板下载
  • 巴中网站建设天仁云商务网站怎么做
  • 怎么架设个人网站frontpage网站模板下载
  • 摄影网站定位优化网站公司哪家口碑好
  • 网站建设优化扬州佛山白坭网站建设
  • 品牌网站建设流程百度网址大全官网旧版
  • 专门做门的网站模板网婚纱
  • 免费推广网站入口商务网站建设策划书范文
  • php体育网站模板做字画的网站
  • 品牌营销型网站建设策划网站信息服务费怎么做分录
  • 网站模板切换小型企业网站的设计与实现
  • 内部网站如何做网站图片幻灯片效果
  • 张家口建设网站天博网站建设
  • 小企业网站建设的服务机构创意网站建设排行榜
  • 建设商场黄金网站上海信用网企业查询
  • 清远市建设工程交易中心网站jf厂高仿手表网站
  • 个人简约网站模板电商培训大概多少学费
  • wordpress 调用缩略图搜索关键词排名优化软件
  • 河南郑州金水区seowhy什么意思
  • 婚介网站模板设计师网名大全
  • 素颜网站建设山西建设监理协会官方网站
  • 烟台优化网站活动页面设计模板
  • 本机做网站服务上传到wordpress云建站教程视频
  • 电子商务网站解决方案网站开发调用别人网站的组件
  • 网站如何取消验证码wordpress合并
  • 高中做信息技术题网站天津飞机模型制作公司
  • 建网站松滋哪家强?wordpress 最后一页
  • 网站建设pc指什么做网站有关机械的图片
  • 美工素材网站嵌入式软件开发简历