阿里巴巴 MySQL binlog 增量订阅&消费组件支持多语言客户端

 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。基于日志增量订阅和消费的业务包括数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据处理当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x工作原理MySQL主备复制原理MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)MySQL...

PHP,软件工具,Golang,.Net,数据库,解决方案 2024-04-29 AM 129次 0条

项目性能优化的指标,目标

性能优化的终极目标是什么性能优化的目标实际上是为了更好的用户体验一般我们认为用户体验是下面的公式:用户体验 = 产品设计(非技术)+ 系统性能 ≈ 系统性能 = 快那什么样的体验叫快呢?3秒定理 一般我们认为网站页面的加载速度在3秒以内就可以称作合格了,加载速度越趋近于0,越快。 3秒定理:Strangeloop在对比了众多网站,并对其性能进行分析之后得出了一个著名的3秒定理,当网站页面加载速度超过3秒后,57%的访客会离开这个网站。  如果想让我们的系统快起来,就要做性能调优。项目性能优化以下可以做为优化的标准:前端工程师:首屏时间、白屏时间、可交互时间、完全加载时间;移动端工程师:端到端响应时间、Crash率、内存使用率、FPS;后端工程师:RT、TPS、并发数。影响因素1:数据库读写、RPC、网络IO、逻辑计算复杂度、缓存影响因素2:JVM[Throughput吞吐量、Footprint访存足迹、Latency延迟]影响性能的关键要素产品设计:产品逻辑、功能交互、动态效果、页面元素基础网络:网络=连接介质+计算终端代码质量&架构移动端环境:设备类型&性能、网络...

PHP,Golang,前端,.Net,解决方案,其他 2024-03-12 PM 238次 0条

微信报错提示 missing prepayid 解决方案

 在对接微信相关支付时,有时候会遇到 missing prepayid 错误,这种错误没有实际的提示信息,一般需要我们逐步排查或者开启日志记录记录详细的错误信息。 解决步骤首先我们反复确保了公钥以及私钥生成正确。确保配置信息填写正确检查相关支付是否已经开通检查商户号是否已经关联对应应用清理并重新生成用户openid和unionid使用对应微信登录的账号进行调取支付问题原因用户unionid或者openid与当前微信不匹配导致,重新清理获取即可此商家的收款功能已被限制,暂无法支付。商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案。 最后我们发现是由 第五和第六条原因造成的,我们将用户 openid 和 unionid 清理后使用微信登录重新生成然后直接发起支付,这个时候就不在提示 missing prepayid 错误了。 当然了还有一部分情况是因为 此商家的收款功能已被限制,暂无法支付。商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案。 导致的。 以上就是我们解决微信报错提示 missing prepayid 解决方案,有遇到同样问题的朋友,...

PHP,解决方案 2024-01-05 AM 498次 0条

Redis 提示 protocol error, got 'u' as reply type byte 解决方案

 遇到一个奇怪的问题,在 php 中使用 workerman 或者传统 pcntl_fork 的开启子进程时 大约十几分钟就会出现一段异常报错 protocol error, got 'u' as reply type byte 初步诊断是redis提示的 大致意思是 协议错误,得到'u'作为回复类型字节 。异常信息protocol error, got 'u' as reply type byte通过代码排查以及报错提示初步判断是redis的问题原因分析 传统 cli 下不会出现这个问题,只有 workerman 下以及 pcntl_fork 的开启子进程时 十几分钟后才会出现。 已知 workerman 底层使用的也是 pcntl_fork 我们直接分析这个函数。 pcntl_fork 函数 先创建主进程然后在根据需要创建N个子进程,而redis使用 单例模式 或者使用 static 来进行保存连接对象时候并且在主线程内有创建这个连接,那么就会出现以上 protocol error, got 'u' as reply type byte 错误 这种异常一般称为...

PHP,Linux,解决方案,其他 2023-12-18 PM 331次 0条

php打包扩展zephir避坑安装指南

 本文主要记录了zephir各种安装失败,打包失败的正确姿势,完美解决各个版本php打包php打包扩展zephir避坑安装指南,一旦拥有别无所求。参考文档zephir官方网站zephir官方中文文档zephir中文文档(备用)")使用系统镜像 我们使用2207版本centos7安装系统CentOS-7-x86_64-Minimal-2207-02.iso系统环境 我们通过宝塔面板来安装指定php版本,当然你也可以使用其他方式安装。宝塔安装Git 如果提示找不到git命令我们可以通过以下命令安装一下gityum install gitzephir安装步骤首先我们来到系统根目录将 php-zephir-parser 通过 Git 方式 Clone 下来githubgit clone https://github.com/zephir-lang/php-zephir-parsergiteegit clone https://gitee.com/laiwi/php-zephir-parser.git国内 Clone 失败可以使用 gitee安装编辑PHP环境zephir_parser.s...

PHP,Linux,解决方案 2023-06-16 AM 455次 0条

解决Liunx安装找不到最新版本软件方案

 我们在使用linux,centos等系统想要安装最新版软件时候发现无论怎安装都是老版本的软件,下面我们通过安装 PHP8.1 , php-devel 等软件来演示一下怎么将linux软件库更新到最新版本。步骤下面我们使用 centos7 来作为演示系统查看当前系统软件库列表 我们通过以下命令可以查看更新之前的软件库内软件的版本。sudo yum search all php-devel 一般情况下 新安装的系统软件库版本比较老旧并没有最新版本的软件。安装 epel-releasesudo yum install epel-release安装最新版 remi 源 Remi 源大家或许很少听说,但是我们强烈推荐,尤其对于不想编译最新版的 Linux 使用者, 因为 Remi 源中的软件几乎都是最新稳定版。sudo yum -y install https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm安装 yum-utilssudo yum -y install yum-utils最后我们再次查看当前系统软...

PHP,Golang,Linux,解决方案 2023-06-13 PM 477次 0条

计数限流算法

 计数器算法实现起来比较简单,它的基本思路是:在单位时间内(如 1 秒钟)对访问次数进行计数,如果超过设定的阈值,则拒绝后续的请求。以下是一个使用 PHP 实现的计数器算法。完整代码class Counter { protected $maxCount = 100; // 设定最大请求数 protected $interval = 60; // 设定时间窗口大小,单位为秒 protected $redis = null; // Redis 连接 public function __construct($maxCount, $interval) { $this->maxCount = $maxCount; $this->interval = $interval; // 建立 Redis 连接 $this->redis = new Redis(); $this->redis->connect('127.0.0.1', 6379); } publi...

PHP,Golang,.Net,解决方案,其他 2023-03-21 PM 505次 0条

令牌桶限流算法

 下面我们通过使用redis实现一个简单通用的令牌桶限流算法解决问题 令牌桶算法主要是以桶的容量为基准,以固定的时间来生产令牌,有效的解决了漏桶效率不高的问题具体实现创建redis对象并定义缓存键$redis = $this->connect(); $key = "aaaaa";开启 watch 并定义定义每分钟最大请求数量$current_time = time(); $max_count = 320; $total_s = 60; $redis->watch($key);计算平均值用于限制每秒请求数量$rate = (int)(($max_count / $total_s) * ($current_time - ¥result_array["time"]));取出最大容量与桶内容量最小值$num = min($max_count, ($result_array["num"] + $rate));判断令牌数/* 令牌小于0 */ if ($num <= 0) { return false; }重新保存令牌$result = json_encode(["num" =>...

PHP,Golang,.Net,解决方案,其他 2023-03-21 AM 500次 0条

实现滑动窗口限流算法

 下面我们通过php使用redis实现一个简单通用的滑动窗口限流算法解决问题 滑动窗口算法主要解决了传统计数限流算法的阶段突发性流量问题。具体实现创建redis对象并定义缓存键$redis = new \Redis(); $redis->connect("127.0.0.1"); $key = "aaaaa";定义每分钟最大请求数量$max_count = 320; $total_s = 60; $current_time = time();计算平均值用于限制每秒请求数量$avg_count = ceil($max_count / $total_s);限制每秒请求数量$range_count = $redis->zRangeByScore($key, $current_time, $current_time); if (count($range_count) > $avg_count) { exit('请求太过频繁,请稍后 -1'); }限制每分钟请求数量$redis->zRemRangeByScore($key, 0, $current_time - 59); $c...

PHP,Golang,前端,.Net,解决方案,其他 2023-03-17 PM 550次 0条

PHP后端面试题

分享下频繁出现的php后端面试笔试题简单描述php8,php7以及之前版本的区别php-fpm fast-cgi cgi 的关系self,this,static分别代表着什么,在什么场景下使用程序中出现高热点数据时会遇到什么问题,怎么解决导出或导入百万级数据会出现什么样的问题,怎么解决在 mvc 中 controller , model , logic , service 之间的关系以及使用场景简单描述下控制翻转,依赖注入,和容器实现原理Db和Model的区别workman和swoole的区别简述几个设计默认以及是实现原理mysql中 innodb 和 myisam 的区别以及使用场景mysql 常用数据库引擎有哪些mysql中 utf8和utf8mb4的区别mysql中 超长度数据段如何根据完整数据快速查询主键、外键和索引的区别简单描述下联合索引和索引mysql常见优化方式简单描述下悲观锁和乐观锁会员表无限级关系储存解决方案简单描述redis和mongodb,memcacahe有什么区别以及常见使用场景redis单线程有什么优势和缺点简单描述下队列实现原理系统大流量解决方案请...

PHP 2023-01-09 AM 452次 0条