杂记
文章平均质量分 61
Leonarde_WP
这个作者很懒,什么都没留下…
展开
-
ID生成器方案
一、主方案mysql步长缓存,提供id二、灾备方案1、数据库主从复制,一主两从并且采用全同步方式2、redis作为兜底方案,redis与mysql生成的id最后一位数字是0/1还有个方案,直接一百个实例,每个实例拥有一个状态编号步长,每台实例的步长是固定的;只是需要定时将限制id记录到存储中,这就需要每个实例一个存储,即使单个实例奔溃也没事;优点:纯内存计算,高可用缺点:初始就要分配好机器数和步长;可以缩容,扩容稍微麻烦些...原创 2021-09-18 13:15:07 · 135 阅读 · 0 评论 -
字节码增强 - 从aop说起
文章目录 前言从AOP说起静态代理动态代理JavaProxyCGLIB 字节码增强实现AOPASMJavaAssist 运行时类加载Instrumentation接口JavaAgentPremainClass随JVM进程启动AgentClass以Attach方法注入Agent 总结 前言 在上篇文章Java字节码技术(一)中已经介绍了Java中字节码相关的基础概念。我们知道,Java代码转换后的JVM指令存在Code区中。如果能对Code区的指令进行新增、修改,即能达到.转载 2021-05-04 15:16:17 · 923 阅读 · 1 评论 -
Java线程池之---ForkJoinPool线程池的使用以及原理
Java 7 引入了一种新的并发框架—— Fork/Join Framework。同时引入了一种新的线程池:ForkJoinPool(ForkJoinPool.coomonPool)@sun.misc.Contendedpublic class ForkJoinPool extends AbstractExecutorService {}本文的主要目的是介绍 ForkJoinPool 的适用场景,实现原理,以及示例代码。说在前面可以说是说明,也可以说下面是结论:ForkJoinP转载 2021-04-30 17:46:21 · 1710 阅读 · 2 评论 -
一个复杂系统的拆分改造实践
1 为什么要拆分?先看一段对话。从上面对话可以看出拆分的理由:1)应用间耦合严重。系统内各个应用之间不通,同样一个功能在各个应用中都有实现,后果就是改一处功能,需要同时改系统中的所有应用。这种情况多存在于历史较长的系统,因各种原因,系统内的各个应用都形成了自己的业务小闭环;2)业务扩展性差。数据模型从设计之初就只支持某一类的业务,来了新类型的业务后又得重新写代码实现,结果就是项目延期,大大影响业务的接入速度;3)代码老旧,难以维护。各种随意的if else、写死逻辑散落在...转载 2021-04-22 21:47:49 · 110 阅读 · 0 评论 -
秒杀系统
解决思路1是分,将非秒杀点击的部分尽可能分出去,单独支持。解决思路2是异步,流量削峰解决思路3是缓存,缓解db压力一、超卖问题1)使用Redis缓存预减库存,减少数据库的访问。因为缓存的访问速度比数据库访问快得多。2)使用内存标记,减少Redis缓存的访问次数。3)使用队列等异步手段,请求先入队缓冲,异步下单,将数据写入数据库(这里还可以再校验一次库存),增强用户体验。总体思路就是要减少对数据库的访问,尽可能将数据缓存到Redis缓存中,从缓存中获取数据。在系统初..转载 2021-04-20 11:29:18 · 139 阅读 · 0 评论 -
DNS负载均衡
1. DNS简介DNS(Domain Name System)是因特网的一项服务,它作为域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。人们在通过浏览器访问网站时只需要记住网站的域名即可,而不需要记住那些不太容易理解的IP地址。在DNS系统中有一个比较重要的的资源类型叫做主机记录也称为A记录,A记录是用于名称解析的重要记录,它将特定的主机名映射到对应主机的IP地址上。如果你有一个自己的域名,那么要想别人能访问到你的网站,你需要到特定的DNS解析服务商的服务器上填写A记录,过一段时间后转载 2021-04-18 16:37:39 · 3786 阅读 · 0 评论 -
IO多路复用
阻塞 IO服务端为了处理客户端的连接和请求的数据,写了如下代码。listenfd=socket();//打开一个网络通信端口bind(listenfd);//绑定listen(listenfd);//监听while(1){connfd=accept(listenfd);//阻塞建立连接intn=read(connfd,buf);//阻塞读数据doSomeThing(buf);//利用读到的数据...转载 2021-04-13 11:44:45 · 93 阅读 · 0 评论 -
聊聊二维码扫码登录的原理
前几天看了极客时间一个二维码的视频[1],写的不错,这里总结下:在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的各种二维码,防止上当受骗。二维码,大家再熟悉不过了。购物扫个码,吃饭扫个码,坐公交也扫个码。在扫码的过程中,大家可能会有疑问:这二维码安全吗?会不会泄漏我的个人信息?更深度的用户还会考虑:我的系统是不是也可以搞一个二维码来推广呢?这时转载 2021-04-13 11:39:10 · 175 阅读 · 0 评论 -
IO多路复用机制详解
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(BlockingIO):即传统的IO模型。(2)同步非阻塞IO(Non-blockingIO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(NewIO)库。(3)IO多路复用(IOMultiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和L...转载 2021-04-11 21:20:00 · 172 阅读 · 0 评论 -
IO多路复用 - Reactor模式
在处理web请求时,通常有两种体系结构,分别为:thread-based architecture(基于线程)、event-driven architecture(事件驱动)thread-basedarchitecture基于线程的体系结构通常会使用多线程来处理客户端的请求,每当接收到一个请求,便开启一个独立的线程来处理。这种方式虽然是直观的,但是仅适用于并发访问量不大的场景,因为线程需要占用一定的内存资源,且操作系统在线程之间的切换也需要一定的开销,当线程数过多时显然会降低web服务器的性...转载 2021-04-11 21:04:49 · 376 阅读 · 0 评论 -
前端页面交互 - 如何功能提示
每个重要的操作按钮旁可以加一个?图片,鼠标悬浮/点击会提示这个功能的详细说明原创 2021-04-05 17:12:56 · 377 阅读 · 0 评论 -
只用数据库如何支持分布式task - mysql乐观锁
思路:一张表 -> task分布式支持表id,taskName(任务名),taskStatus(执行状态,0待执行,1执行中),taskConditionVal(任务条件值,与taskStatus配合,判断任务是否要执行),taskProgressVal(任务进度值),ip,createdAt,updatedAt假设定时任务每半小时执行一次执行任务时,多台机器同时set taskStatus=1, ip=XXX where taskStatus=0 and taskConditionVal原创 2021-03-07 20:09:54 · 190 阅读 · 0 评论 -
序列化/反序列化
本文 Github开源项目:github.com/hansonwang99/JavaCollection中已收录,有详细自学编程学习路线、面试题和面经、编程资料及系列技术文章等,资源持续更新中...工具人曾几何时,对于Java的序列化的认知一直停留在:「实现个Serializbale接口」不就好了的状态,直到 ...所以这次抽时间再次重新捧起了尘封已久的《Java编程思想》,就像之前梳理《枚举部分知识》一样,把「序列化和反序列化」这块的知识点又重新审视了一遍。序列化是干啥用的?序列化的原本转载 2021-01-03 21:42:40 · 174 阅读 · 0 评论 -
前端页面交互 - 如何提示用户操作按钮
有些页面较长,重要按钮放在上方或者下方都无法让人重视。通用的解决办法:1、按钮一直悬浮在页面下方 2、平时“提交”按钮可以是灰色,一旦页面修改,颜色变亮提示点击。原创 2020-12-03 11:58:30 · 1319 阅读 · 0 评论 -
微服务之-ServiceMesh
今年,ServiceMesh(服务网格)概念在社区里头非常火,有人提出2018年是ServiceMesh年,还有人提出ServiceMesh是下一代的微服务架构基础。作为架构师,如果你现在还不了解ServiceMesh的话,是否感觉有点落伍了?那么到底什么是ServiceMesh?它诞生的背景是什么?它解决什么问题?企业是否适合引入ServiceMesh?根据近年在一线互联网企业的实践和思考,从个人视角出发,我为大家一一解答这些问题。微服务架构的核心技术问题在业务规模化和研发效能提升...转载 2020-09-21 12:08:10 · 1890 阅读 · 0 评论 -
docker for desktop 安装配置
一、官网下载安装二、镜像配置解决docker镜像下载问题https://www.cnblogs.com/feifei-cyj/p/12678823.htmlhttps://cr.console.aliyun.com/cn-hangzhou/instances/mirrors三、安装一些常用软件https://www.runoob.com/docker/docker-install-ubuntu.html...原创 2020-09-03 14:02:15 · 860 阅读 · 0 评论 -
让业务不再需要打日志
问题:有的业务开发打得日志并不全面详细,导致线上问题难以定位;或者打的无效日志过多,造成资源浪费实现思路:1、每个请求(http、task、rpc等等)分配一个随机数,所有方法的入参用字节码将这个随机数传进去2、该请求中的所有外部操作(db、rpc、redis等等)的都需要log打印这个随机数+出入参好处:1、一个随机数可以查到所有相关的必要日志2、打印的日志更专业,根据日志出入参+mock单测就可以快速定位到问题。难点:1、需要封装所有的外部组件2...原创 2020-08-19 17:54:38 · 191 阅读 · 1 评论 -
对象深拷贝的utils
import com.fasterxml.jackson.core.type.TypeReference;import com.fasterxml.jackson.databind.ObjectMapper;import org.apache.commons.lang3.SerializationUtils;import java.io.IOException;import java.io.Serializable;public class DeepCopyUtils { publ.原创 2020-08-12 21:26:16 · 392 阅读 · 0 评论 -
如何降低团队bug率
1、开发:单测-接口测试(运行真实代码,不用mock)2、测试:提供测试覆盖率报告3、组长:合并代码时,需要开发和测试提供“单测代码”+“覆盖率报告”特殊情况特殊分析原创 2020-08-11 11:53:21 · 660 阅读 · 0 评论 -
一个需求的生命周期
一、业务维度1、做什么-》解决什么问题-》有什么好处意义二、功能维度1、要做什么功能-〉功能细节-》是否需要多方协同三、技术维度1、能否技术实现2、实现步骤3、有无参考,问题点,重难点攻克4、预估时间5、开发四、测试1、自测-》代码检查-》全场景回归-》业务测试-〉并发测试五、线上发布1、灰度验收-〉全流量观察六、需求关闭...原创 2020-08-09 17:02:59 · 860 阅读 · 0 评论 -
领域驱动设计-个人理解
领域:有边界的业务集设计:技术实现以业务为主,业务驱动技术,技术实现业务。技术实现用来解决这一类的业务集,以后这一类的业务都可以通过这块技术进行处理。解决问题的时候,除非有技术壁垒,否则不要去考虑技术细节(db调优、消费不足),所有技术都是工具;别人提出问题,先考虑如何用工具的组合去解决这个问题,去考虑理论上的可行性,后面才是一些细节方面的调优,不要本末倒置。...原创 2020-08-05 15:16:52 · 126 阅读 · 0 评论 -
天网的搭建思路
问题:在工作中,由于人性上的种种缺点,由人直接管理人会有许多无法解决的问题。解决思路:由人管计算机(制定规则),再由计算机管人(执行规则),形成良好的制约协同发展,是一种解决方案。 就像太极一样,有黑有白,转动起来,共同强大。问题1:如何让人与机器的发展中,不处于被统治压迫的地位?用硬编码,整个系统不使用人工智能,计算机就不会有智慧,只是根据不同的输入进行固定的流程进行输出。固定的流程是由人类制定,所以机器只是辅助,人类才是主体。问题...原创 2020-08-05 12:05:39 · 362 阅读 · 1 评论 -
jar包升级后的验收方案
工作中有时候会遇到jar包升级的情况;如果升级版本跨度较大,可能会导致代码线上报错。解决方法:一、全场景回归一遍二、将使用这个jar中的工具方法,全部mock测试一遍原创 2020-08-04 16:42:26 · 790 阅读 · 0 评论 -
仿MapReduce的高并发大数据测试工具
import com.google.common.collect.Lists;import com.google.common.util.concurrent.ThreadFactoryBuilder;import org.apache.commons.collections.CollectionUtils;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Obj.原创 2020-08-03 11:05:49 · 194 阅读 · 0 评论 -
切换接口的方案(新老接口切换utils)
一、不重要可忽略的一刀切二、重要的查询接口,发第一版:新老接口对比校验;充足时间后发第二版:新接口取代老接口三、重要的编辑接口,开关控制、灰度百分比流量控制原创 2020-07-29 14:11:54 · 1207 阅读 · 0 评论 -
负载均衡的实现方案
一、先请求,到了负载均衡器,负载均衡器根据服务提供方的情况,进行请求分发。如Nginx这种是请求方是不能知道服务提供方信息的。二、先获取到服务提供方的情况,负载均衡器根据服务提供方的情况,才进行请求。如Ribbon、dubbo负载均衡这种是请求方能知道服务提供方信息,一般是企业内部使用。...原创 2020-07-23 21:53:55 · 152 阅读 · 0 评论 -
服务发现组件的实现原理
有三个角色:服务提供方、服务发现组件、服务请求方一、服务提供方:1)向组件注册服务信息(IP地址、端口、接口信息等)2)会向组件进行心跳访问,一旦组件几个周期都没有收到某个服务实例的心跳,则剔除这个服务的该服务实例3)服务实例在关闭的时候还会自主调用组件,将自身服务实例从这个服务中剔除二、服务发现组件:提供的能力:存储、定时删除、调用删除、查询三、服务请求方:1)向组件注册请求方信息(IP地址、端口等),方便后续梳理调用链2)从组件处获取服务提供方的信息,缓存下来,每过一段时间更新缓原创 2020-07-23 21:41:35 · 376 阅读 · 0 评论 -
如何让你的Nginx 提升10倍性能?
提升Web应用的性能从未像今天这样刻不容缓。在线经济活动的比例日益提高,就连发展中国家和地区的经济活动都已经有5%以上在线进行了(相关数据请参考本文后面的资源)。在这个超级链接、随时在线的现代世界,用户的期望也远非昔日可比。如果你的网站不能马上响应,你的应用不能立即运行,用户转身就会投奔你的竞争对手。亚马逊大约10年前的一项研究表明,页面加载时间减少1/10秒,能够使其营收增长1%。另一项近期的调查也显示,一多半受访站点所有者提到因为自己应用的性能不佳导致了收入减少或者用户流失。一个网站到底多快转载 2020-07-22 11:52:10 · 232 阅读 · 0 评论 -
Hbase
1原创 2020-05-15 14:56:03 · 169 阅读 · 0 评论 -
hive介绍
Hive利用HDFS存储数据,利用MapReduce查询数据。Hive中所有的数据都存储在HDFS中,没有专门的数据存储格式,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构...原创 2020-04-27 11:58:51 · 298 阅读 · 0 评论 -
hadoop(HDFS、MapReduce)
hadoop三大核心组件:1、HDFS:分布式存储系统(实时key-value查询hbase、HiveQL离线统计分析hive都是基于此开发的技术)2、MapReduce:分布式计算系统3、YARN: hadoop 的资源调度系统1、在HDFS上存储文件的时候,文件会按照配置的大小进行分块,每个分块会按照设置的副本的数目,在hdfs上面存储。HDFS不支持文件的修改,因为是分...原创 2020-04-26 19:55:02 · 268 阅读 · 0 评论 -
zookeeper是如何保证集群之间的数据一致性的
zk是leader-follower机制,所有的写操作是leader广播通知到所有follower,那么广播肯定是不可靠的,万一有的follower没有操作本地数据,所有打到这台follower的请求读到的不是脏数据了吗?zk保证的是最终一致性,短时间是会有脏读的产生。但是每一个操作都有一个id,这个id本身也是严格递增的。只有出现集群崩溃重新选举leader的时候,id才会有跳跃。fo...原创 2020-04-26 14:12:44 · 1614 阅读 · 1 评论 -
Mac下IDEA的常用快捷键
先确认快捷键的配置是否一致一、cmd+shift+O查找文件二、cmd+shift+F全局查找三、cmd+option+←跳转上一次浏览的位置四、cmd+alt+→ 撤销跳转上一次浏览的位置五、Ctrl+A:到行首(达到Home键的效果)六、Ctrl+E:到行尾(达到End键的效果)七、cmd+delete删除行八、cmd+option+L...原创 2020-04-23 15:58:39 · 1648 阅读 · 0 评论 -
Macbook非常好用的一些功能
一、全局搜索 spotright (快捷键:command+空格)二、Air Drop 隔空投送:向附近苹果设备传输文件三、截图:1、如果想要对屏幕上的某个区域进行截图,请同时按住shift+command+4,然后屏幕上就会出现一个【+】的光标,按住鼠标左键拖动光标,画出需要截图的区域,然后松开鼠标左键,截图就完成了。2、如果想要对整个屏幕进行截图,请同时按住shift+comm...原创 2020-04-23 11:52:25 · 627 阅读 · 0 评论 -
Mac升级Catalina之后,当在根目录或者其他系统目录下进行文件修改就会提示:Read-only file system
mac升级之前只要获得权限后就可以在几乎任何目录下新建和删除文件。但是当mac升级到最新的版本catalina后,当在根目录或者其他系统目录下进行文件修改就会提示:Read-only file system解决办法:1.重启电脑,按住 cmd+R进入恢复模式关闭SIP: csrutil disable,然后重启2.重新挂载根目录: sudo mount -uw /,接下来划重点:...转载 2020-04-22 22:40:36 · 5833 阅读 · 0 评论 -
Git merge并push到远程分支,但又要回滚到merge之前的代码
1、使用git reflog查看所有HEAD历史2、观察日志列表内容,找到这次merge 之前 git log例:ce7397d8 HEAD@{36}: commit (merge): Merge branch 'develop' into release0d055a70 HEAD@{37}: pull --progress --no-stat -v --progress origi...原创 2020-04-20 11:20:27 · 1807 阅读 · 1 评论 -
日志分析系统搭建思路
少走弯路,2020年主流实现:1、日志收集用filebeat;数据过滤用logstash;ES存储日志信息;kibana显示日志2、日志数据量大了,可以把日志扔到kafka上,logstash消费到es...原创 2020-04-13 17:00:49 · 366 阅读 · 0 评论 -
后端设想-业务与技术分离
一、系统分工1、业务中心:侧重复杂业务的实现,每个部门一个业务中心。岗位重点:代码规范,文档,汇报2、各方系统:侧重技术,流程实现,繁重的判断业务迁移到业务中心,只保留轻便的业务和实现流程。岗位重点:交互、流程图、高并发。二、人员分工1、产品2、业务中心开发3、各方系统开发4、业务中心架构开发三、工作分工一个需求需要 业务中心开发、各方系统开发 人员...原创 2020-04-23 14:37:11 · 631 阅读 · 0 评论 -
数据的存储结构
数据的存储结构,通常分为四类:顺序、链式、索引、散列存储结构。一、顺序存储结构:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示,在C语言中用数组来实现顺序存储结构二、链式存储结构:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针表示,在C语言中用指针来实现链式存储结构三、索引存储结构:在存储结点信息的同时,还建立附加的索引表,比如手机的通讯...转载 2020-03-29 14:21:34 · 7120 阅读 · 0 评论 -
批量数据推送如何保证下游方正确接收到
思路一:1、上游推送批量数据前,先告知下游这批数据的总量2、上游开始往下游推送数据当上游推数据过程中失败,上游重试,下游检查到size不对,也不会进行下一步的操作当上游推送数据完成,下游检查到size一致,触发下一步的机制...原创 2020-03-27 19:32:00 · 673 阅读 · 0 评论