- 博客(352)
- 收藏
- 关注
原创 kafka如何保证消息不丢失
Kafka发送消息是异步发送的,所以我们不知道消息是否发送成功,所以会可能造成消息丢失。而且Kafka架构是由生产者-服务器端-消费者三种组成部分构成的。要保证消息不丢失,那么主要有三种解决方法。
2024-06-09 20:15:54 4802 57
原创 零拷贝(Zero Copy)
零拷贝技术指的是在计算机执行操作时,CPU不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文以及CPU的拷贝时间。他的作用是在数据报从网络设备到用户程序空间传递的过程,减少数据拷贝的次数,减少系统调用,实现CPU的零参与,彻底消除CPU在这方面的负载,实现零拷贝的最主要的技术就是DMA数据传输技术和内存区域映射技术。零拷贝就是可以减少数据在用户缓冲区和内核缓冲区之间的反复的I/O拷贝操作。零拷贝机制可以减少用户进程地址空间和内核地址空间之间因为上下文切换带来的CPU开销。
2024-05-28 15:43:46 3296 46
原创 MQ的消息如何保证可靠性
每个只能配置一个,因此我们可以在配置类中统一设置。@Slf4j@Overridelog.error("触发return callback,");});由于每个消息发送时的处理逻辑不一定相同,因此ConfirmCallback需要在每次发消息时定义。具体来说,是在调用RabbitTemplate中的convertAndSend方法时,多传递一个参数:id:消息的唯一标示,MQ对不同的消息的回执以此做判断,避免混淆:回执结果的Future对象将来MQ的回执就会通过这个。
2024-05-06 16:51:00 1058 66
原创 四种网络IO模型
IO是计算机内存与外部设备之间拷贝数据的过程。CPU访问内存的速度远高于外部设备。因此CPU是先把外部设备的数据读取到内存,在进行处理。时间局部性空间局部性一次IO会把一块或一块旁边的数据全部加载到内存种。
2024-04-30 11:14:55 2534 55
原创 Redis集群部署Windows版本
之前因为数据量的原因,并没有进行Redis集群的配置需要,现在由于数据量大,需要进行集群部署。最初在windows系统部署,需要Redis的windows版本,但官方没有windows版本,所以需要去gitHub上找由民间志愿者维护的windows的版本。
2024-07-22 10:46:58 1881 62
原创 【Go】函数的使用
虽然package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说都是不方便的,所以建议用户在一个package中每个文件只写一个init函数。程序的初始化和执行都始于main包如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时。
2024-07-08 18:56:11 1122 2
原创 【Netty】Future & Promise
首先要说明 netty 中的 Future 与 jdk 中的 Future 同名,但是是两个接口,netty 的 Future 继承自 jdk 的 Future,而 Promise 又对 netty Future 进行了扩展。netty Promise 不仅有 netty Future 的功能,而且脱离了任务独立存在,只作为两个线程间传递结果的容器。netty Future 可以同步等待任务结束得到结果,也可以异步方式得到结果,但都是要等任务结束。同步处理任务失败 - await。await 死锁检查。
2024-06-23 18:19:10 1107 13
原创 【Netty】Channel
channel 的主要作用close() 可以用来关闭 channelcloseFuture() 用来处理 channel 的关闭sync 方法作用是同步等待 channel 关闭而 addListener 方法是异步等待 channel 关闭pipeline() 方法添加处理器write() 方法将数据写入writeAndFlush() 方法将数据写入并刷出。
2024-06-23 16:40:28 298 1
原创 idea怎么重复启动实例
在学习Netty使用IDEA时会遇到需要启动2次及以上相同的java程序,但是当我直接在IDEA中运行的时候他会提示我已经运行了,是否停止并重新运行(下图的状况)第一步:右键你要重复运行的类(前提已经在运行一个,不然是没有Edit的),然后找到Edit....第一个选型,allow multpile instances。
2024-06-22 22:19:51 600 4
原创 【Netty】EventLoop组件
EventLoopGroup 是一组 EventLoop,Channel 一般会调用 EventLoopGroup 的 register 方法来绑定其中一个 EventLoop,后续这个 Channel 上的 io 事件都由此 EventLoop 来处理(保证了 io 事件处理时的线程安全)到关闭状态从而拒绝新的任务的加入,然后在任务队列的任务都处理完成后,停止线程的运行。客户端,启动三次,分别修改发送字符串为 zhangsan(第一次),lisi(第二次),wangwu(第三次)它的继承关系比较复杂。
2024-06-22 22:09:14 251 4
原创 设计模式之单例模式
该模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。这样虽然解决了线程安全,但其实实例化操作只做一次,而获取实例(即getInstance)的操作是很多次的,把调用的方法加上同步,会大大降低效率。起到了懒加载效果,但是只能在单线程使用,多线程会不安全,因为当多个线程并发同时判断instance为空时,就会相应的实例化多个对象。优点:写法简单,在类加载的时候完成实例化,避免了线程同步的问题。
2024-06-21 16:02:40 1705 56
原创 设计模式之代理模式
代理模式时由于某些原因给某对象提供一个代理来控制该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象的中介,又称为委托模式。
2024-06-18 18:08:06 1201 9
原创 【Netty】nio处理accept&read&write事件
TLV 格式,即 Type 类型、Length 长度、Value 数据,类型和长度已知的情况下,就可以方便获取消息大小,分配合适的 buffer,缺点是 buffer 需要提前分配,如果内容过大,则影响 server 吞吐量。一种思路是首先分配一个较小的 buffer,例如 4k,如果发现数据不够,再分配 8k 的 buffer,将 4k buffer 内容拷贝至 8k buffer,优点是消息连续容易处理,缺点是数据拷贝耗费性能。如果不取消,会每次可写均会触发 write 事件。
2024-06-18 09:01:24 1775 49
原创 【Netty】nio阻塞&非阻塞&Selector
可以采用线程池技术来减少线程数和线程上下文切换,但治标不治本,如果有很多连接建立,但长时间 inactive,会阻塞线程池中所有线程,因此不适合长连接,只适合短连接。32 位 jvm 一个线程 320k,64 位 jvm 一个线程 1024k,如果连接数过多,必然导致 OOM,并且线程太多,反而会因为频繁上下文切换导致性能降低。客户端发送数据过来,客户端正常、异常关闭时,都会触发 read 事件,另外如果发送的数据大于 buffer 缓冲区,会触发多次读取事件。
2024-06-17 15:53:43 916 3
原创 FileChannel的使用
channel 必须关闭,不过调用了 FileInputStream、FileOutputStream 或者 RandomAccessFile 的 close 方法会间接地调用 channel 的 close 方法。在 while 中调用 channel.write 是因为 write 方法并不能保证一次将 buffer 中的内容全部写入 channel。这时写入,会追加内容,但要注意如果 position 超过了文件末尾,再写入时在新内容和原末尾之间会有空洞(00)设置当前位置时,如果设置为文件的末尾。
2024-06-16 20:33:06 441 4
原创 【Netty】ByteBuffer原理与使用
Buffer则用来缓冲读写数据,常见的buffer有:ByteBufferhortBufferIntBufferLongBufferCharBuffer使用fileChannel读取文件内容输出10:39:03 [DEBUG] [main] c.i.n.ChannelDemo1 - 读到字节数:1010:39:03 [DEBUG] [main] c.i.n.ChannelDemo1 - 读到字节数:4。
2024-06-16 20:14:46 1082 1
原创 如何实现跨域
而且在服务器端接受到 JSONP 请求后需要设置 请求头,添加 Access-Control-Allow-Origin 属性,属性值为 * ,表示允许所有域名访问,这样浏 览器才会正常解析,否则会报 406 错误。同源安全策略 默认阻止“跨域”获取资源。Access-Control-Allow-Headers 用在对预请求的响应中,指示实际的请求中可以使用哪些 HTTP 头。Access-Control-Allow-Methods 指定对预请求的响应中,哪些 HTTP 方法允许访问请求的资源。
2024-06-14 22:46:18 1230 6
原创 ThreadLocal详解
如果当前线程再迟迟不结束的话(比如线程池的核心线程),这些key为null的Entry的value就会一直存在一条强引用链:Thread变量 -> Thread对象 -> ThreaLocalMap -> Entry -> value -> Object 永远无法回收,造成内存泄漏。在ThreadLocal和key被回收后,entry中就存在key为null,但value还有值的entry对象,但是永远访问不到,同样除非线程结束。在Entry本身就是一个弱引用,ThreadLocal也是一个弱引用。
2024-06-14 22:43:26 494
原创 设计模式之责任链模式
为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。责任链模式的本质是解耦请求与处理,让请求在处理链中能进行传递与被处理;理解责任链模式应当理解其模式,而不是其具体实现。责任链模式的独到之处是将其节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动起来。
2024-06-13 20:26:25 931 39
原创 git如果将多次提交压缩成一次
git rebase会打开一个vim文本编辑器(需要会修改保存和退出),显示了最近的 n 个提交记录。每个提交前面都有一个 pick 关键字,表示保留该提交。若要合并两个相邻的提交,只需删除第二个提交之前的 pick 关键字,改为 squash 或 s。同样,若要合并更多的提交,只需按照上述操作修改对应的提交行。git reset的本意是版本回退,回退时可以选择保留commit提交。我们基于git reset的作用,结合新建分支,可以实现多次commit提交的合并。这个不需要vim编辑,很少有冲突。
2024-06-13 18:52:03 583 3
原创 Redis缓存的使用
当出现Redis查不到数据,数据库也查不到数据的情况,我们就把这个key保存到Redis中,设置value="null",并设置其过期时间极短,后面再出现查询这个key的请求的时候,直接返回null,就不需要再查询数据库了。两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第 二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们 还可以根据具体的业务需求进行自定义的缓存淘汰,
2024-06-12 23:05:29 3317 4
原创 Redis的持久化机制&过期策略&内存淘汰策略
假设 AOF 日志记录了自 Redis 实例创建以来所有的修改性指令序列,那么就可以通过对一个空的 Redis 实例顺序执行所有的指令,也就是「重放」,来恢复 Redis 当前实例的内存数据结构的状态。优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。
2024-06-12 22:32:20 801
原创 人工智能GPT-4o?
1. **参数规模:** GPT-4o在参数规模上有所优化,尽管具体的参数数量可能不如GPT-4庞大,但它通过更高效的训练和模型架构优化,达到了与GPT-4相似甚至更好的性能。在讨论GPT-4o时,我们首先需要了解其前身,即GPT-4,以及其之前的版本。3. **训练数据:** GPT-4o可能利用了更新、更大规模的训练数据集,涵盖了更多的领域和语言,提高了模型的广泛性和准确性。1. 模型压缩和优化: GPT-4o可能采用了先进的模型压缩和优化技术,使得在保持高性能的同时降低计算资源的消耗。
2024-06-11 18:40:18 1040 7
原创 springboot使用kafka事务
如上:消费者没打印消息,说明消息没发送成功,并且前面会报错org.apache.kafka.common.KafkaException: Failing batch since transaction was aborted 的错误,说明事务生效了。kafka事务属性是指一系列的生产者生产消息和消费者提交偏移量的操作在一个事务,或者说是是一个原子操作),同时成功或者失败。配置开启事务后,使用大体有两种方式,先记录下第一种使用事务方式:使用 executeInTransaction 方法。
2024-06-11 18:30:09 804 62
原创 kafka生产消费流程
1.生产者先从zookeeper的"/brokers/topic/主题名/partitions/分区名/state"节点找到该partition的leader。比如,消费者可以重置到旧的偏移量,重新处理之前已经消费过的消息;或者直接跳到最近的位置,从当前的时刻开始消费。kafka采用拉取模型,由消费者自己记录消费状态,每个消费者相互独立的顺序拉取消息。leader接收到所有的ISR中的Replica的ACK中,并向生产者返回ACK。broker进程上的leader将消息写入到本地log中。
2024-06-09 19:59:57 1459 2
原创 kafka的leader和follower
在Linux中强制杀掉该Kafka的进程,然后观察leader的情况。kafka的leader负责读写,follower不能读写数据(确保每个消费者消费的数据是一致的),kafka一个topic有多个分区leader,一样可以实现负载均衡。如果kafka是居于ZK进行选举,ZK的压力比较大,例如某个节点崩溃,这个节点上不仅仅只有一个leader,是有不少的leader需要选举,通过ISR可以快速选举。kafka会再创建topic的时候尽量让分配分区的leader在不同的broker中,就是负载均衡。
2024-06-08 20:45:41 1977 22
原创 kafka的副本机制
副本的目的就是冗余备份,当某个Broker上的分区数据丢失时,依然可以保障数据可用。因为在其他的Broker上的副本是可用的。
2024-06-07 17:17:44 536 4
原创 Kafka的分区副本机制
1.自定义分区器@Override@Override// cluster.partitionCountForTopic 表示获取指定topic的分区数量@Override2.在kafka生产者配置中,自定义使用自定义分区器的类名。
2024-06-07 17:02:00 2556 36
原创 Kafka进阶(一)
Kafka生产者生产消息到partition,如果直接发送消息,kafka会将消息保存到分区中,但Kafka会返回一个ack给生产者,表示当前操作是否成功,是否已经保存了这条消息。如果ack响应的过程失败了,此时生产者会重试,继续发送没有发送成功的消息,Kafka又会保存一条一模一样的消息。当Kafka的生产者生产消息时,会增加一个pid(生产者的唯一编号)和sequence number(针对消息的一个递增序列)一个topic中如果只有一个分区,那么这个分区只能被某个组中的一个消费者消费。
2024-06-04 20:06:09 958 35
原创 Kafka入门
消息队列——用于存放消息的组件程序员可以将消息放入到队列中,也可以从消息队列中获取消息很多时候消息队列不是一个永久性的存储,是作为临时存储存在的(设定一个期限:设置消息在MQ中保存10天)消息队列中间件:消息队列的组件,例如:Kafka、Active MQ、RabbitMQ、RocketMQ、ZeroMQ。
2024-06-04 19:57:05 664 1
原创 IO多路复用
epoll是为了解决select的缺点,它定义了epoll_event结构体来解决,解决了select存在最大连接数的限制,epoll不会遍历所有的文件描述符(fd),epoll会将准备就绪的文件描述符维护在一块指定的空间内,每次从中取出已经准备就绪的文件描述符处理,大大提高性能。在IO多路复用模型中通过select/epoll系统调用,单个应用程序的线程,可以不断轮询成百上千的socket连接,当某个或者某些socket网络连接有IO就绪的状态,就返回对应的可以执行的读写操作。
2024-06-03 17:12:26 670 36
原创 Spring解决循环依赖
BeanB同样回去一级缓存中查找是否存在B实例,由于还没有创建,Spring会将bean B的半成品放入二级缓存,继续创建买这个B需要依赖A,由于A的工厂对象已经放在三级缓存中了,spring可以直接获取三级对象中的beanA的工厂对象,通过它来创建beanA的实例。Spring容器开始创建A对象,会先去一级缓存中查看是否有BeanA的实例,如果没有就会创建一个A的实例,并将其工厂对象放入三级缓存中,然后BeanA 的创建因为需要注入B而被挂起,Spring开始创建BeanB对象。,并将其放入一级缓存。
2024-06-01 11:14:11 906 6
原创 Synchronized的升级过程
Thread-1加锁失败,进入锁膨胀阶段,为Object对象申请Monitor锁,通过object对象头获取到持有锁的线程,将该线程设置为owner,将对象头的markword设置为指向monitor的地址。线程获取轻量级锁,会使用CAS操作,将MarkWord替换成指向自己的锁记录的指针,如果CAS成功,则说明获取轻量级锁成功,可以进入同步块,如果CAS失败,则表示锁竞争失败,需要升级为重量级锁。如果有取值为null的锁记录,表示重入,这时重置锁记录,表示重入计数-1。
2024-05-30 17:35:36 740 3
Spring的代理与事务
2024-02-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人