六道漫步

唯有编程能使我忘记ACG,唯有ACG能使我忘记编程.

分布式架构常见的问题与解决方案

布式架构分常见的问题与解决方案

分布式与集群 现在随处可见分布式集群这个词,由于分布式和集群这两个词经常被放在一起使用,所以两个词似乎就是连在一起使用的,其实并非如此. 个人认为,集群指的是多台机器节点部署的是同样的应用,提供的是同样的服务. 而分布式指的是一个操作,需要在不同的服务节点完成. 所以分布式和集群本身是两个概念,要解决的也是不同的问题. 集群要解决的问题是高并发请求下单节点服务器存在性能上限和节点宕...

ZooKeeper单一系统映像仅保证客户端级别的单调递增一致性

ZooKeeper单一系统映像常见误解:保证读操作获取最新值

ZooKeeper ZooKeeper是大家最熟悉的开源的分布式协调服务,提供了高可用、高性能、稳定的分布式数据一致性解决方案. 单一系统映像 绝大部分介绍ZooKeeper的博客在说到其特点和功能时总是会说 单一系统映像:无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的。 实际上这句话确实来自于ZooKeeper官方的文档说明,原文为 ...

数据库null值替代值的优雅处理方案

数据库null值替代值的优雅处理方案

数据库null值替代值 在编程中,各个编程语言中,null值都是一个特殊含义的值.代表的是空值. 各个数据库也同样支持null值,但是由于null值的特殊性,sql条件的实际结果会和一般开发人员的预期结果完全不同.所以一般会要求在非特殊情况下,尽量使用特定值来替代null值. 这个数据库特定值我们就可以称之为null值替代值. 因此会出现同样是表示一个数据的某个字段值未填写状态,代码...

逻辑删除实现方案

逻辑删除实现方案

概念 逻辑删除又名软删除,与物理删除、硬删除相对应,含义是并没有实际的删除数据,只是对外部屏蔽了这些数据,对外部造成了数据已经被删除的假象. 逻辑删除是一个非常常见的需求和概念,例如windows系统的删除文件和文件夹就是逻辑删除,很明显的是被删除的文件和文件夹在回收站还能被看见,很明显这是一种逻辑删除. 作用 总体来讲,逻辑删除的作用主要是保留被删除数据,在某些地方对被删除数据进行查...

API网关

公司API网关接手的总结分享

API网关的应用场景 单体架构下网关逻辑直接合并在应用 在单体架构下,总共也就一个应用,所有的用户登录校验和鉴权直接在单体应用完成即可. 微服务架构下需要抽离网关逻辑在单独的网关应用 而在微服务的架构体系下,有多个应用,每个应用只关心自己的业务. 此时让所有的微服务都自行开发代码.进行用户登录校验有以下几个问题: 显然违反DRY(Don’t Repeat Yourself)原,...

springboot bean加载顺序问题

记一次疑难bug解决经历

一次疑难bug解决经历 bug情况 项目是一个spring cloud项目,使用了spring cloud stream组件规范来收发消息,平时http请求使用的是fastjson,但是stream message使用的还是默认的jackson. 而BUG是在发送stream message的时候,本地环境时枚举是序列化为name,而在线上却序列化为code,即线上和线下的序列化行为不一...

参照rocketmq和kafka实现的数据库消息

参照rocketmq和kafka实现的数据库消息

rocketmq、kafka与其他消息队列的最大不同点 ActiveMQ、RabbitMQ等以前的消息队列和rocketmq、kafka两个消息队列的最大不同点在于消息持久化层的定位. 消息队列传统架构 对于ActiveMQ、RabbitMQ等以前的消息队列来说,每一条消息都有且只有一个明确的发送方和一个明确的接收方. 即使是广播模式的消息,实际上每条消息也只有一个接收方,实际上是给每个每...

批量插入的两种含义和效率说明

批量插入的两种含义和效率说明

这篇文章是对”批量插入效率如何“这个常见问题的回答.实际上这个常见问题是非常具有歧义性的. 首先我们都知道插入的意思是将数据写入到数据库中,而数据库的唯一可使用的语言是sql,写入数据属于sql中的dml语句. 当然,大多数时候编程中是不会直接使用sql语句来进行编程的,以java为例,通常不会使用jdbc的方式来操作数据库,而是使用如mybatis、hibernate、spring d...

一次线上内存泄漏问题的排查

与FastjsonHttpMessageConverter有关的内存泄漏问题

与FastjsonHttpMessageConverter有关的内存泄漏问题 (一). 排查经过 1.首先确定有内存泄漏问题的是因为报了这个异常:java.lang.OutOfMemoryError:GC overhead limit exceeded 默认情况下,当应用程序花费超过98%的时间用来做GC并且回收了不到2%的堆内存时,会抛出java.lang.OutOfMemoryError...

SSM中的类型转换、格式化、序列化与反序列化

SSM中的类型转换、格式化、序列化与反序列化

定义与区别 类型转换、格式化、序列化与反序列化三个概念是相似而且经常相关,联系在一起的. 类型转换(convert):将A类型的源对象转换为目标B类型的对象. 格式化(formatter):将一个对象输出为显示的格式或者说容易让人理解的格式.以及把从显示的格式解析为对象. 序列化(serializer)与反序列化(deserializer):序列化是指把对象二进制化数据写入IO...