消息队列系统存储架构演进

消息队列(Message Queue)是一种在消息的传递过程中存储消息的机制,广泛应用于系统解耦、流量削峰、数据同步等场景。本文将重点讨论三种流行的消息队列技术的存储架构(RocketMQ、Kafka和Pulsar)以及当前的演变趋势。

Read more

小模型(Small Language Model)信息汇总

随着人工智能领域的不断发展,语言模型也变得越来越重要。在这个领域中,小模型(Small Language Models)正逐渐崭露头角,与大模型(Large Language Models)相比,它们有着独特的特点和潜在的价值。这篇文章主要关注两点,模型的进展,推理的进展,特别是在消费级设备(PC,移动设备)相关的进展。

Read more

RabbitMQ持久化机制

之前其实已经写过一篇关于RabbitMQ持久化的文章,但那篇文章侧重代码层面的写入流程,对于持久化操作何时发生以及什么时候会刷新到磁盘等问题其实都没有搞清楚,这篇文章着重于关注这些问题。

Read more

RabbitMQ HA机制

RabbitMQ为了保证消息不丢失,提供了高可用机制,或者称为镜像队列,详细文档可以参考这里,本文试图搞清楚其实现细节。

Read more

队列系统问题总结

概述

对队列系统至今出现的各种问题进行总结。这个系统主要是分为这么几个部分:

  • RabbitMQ:消息broker;
  • Proxy:架在RabbitMQ前面,主要作用是负载均衡及高可用:消息可以路由到后端多个结点,任一结点的异常不会影响客户端;并且可以让RabbitMQ更方便的进行水平扩展;
  • 客户端SDK:为了避免让产品方了解AMQP协议的细节(Exchange、bindings等),对标准的RabbitMQ客户端进行封装,只提供两个简单的接口:sendMessage,consumeMessage,并提供配置选项来定制客户端的行为。
Read more

Java中日志文件的读取

问题

应用中有时候会有读取日志文件,并做近实时分析的需求(日志监控等)。但是使用类似Log4j的日志框架,日志文件可能会滚动:老的日志文件重命名成其它文件名(比如以日期为后缀),生成一个与老文件同名的新文件,这时候就需要读取日志文件的线程能够正确区分新老文件,并读取相应更新并且不会漏读数据。当然,这个问题的前提是:日志文件本身只会append,而不会在文件中间写入或者删除。本文主要分享下解决这个问题时碰到的一些问题及解决方案。

Read more

Java并发源码分析 - ForkJoin框架

功能

根据Java文档描述,ForkJoinPool中一种特殊的ExecutorService,可以执行ForkJoinTask。ForJoinTask可以在运行时Fork子任务,并join子任务的完成,本质上类似分治算法:将问题尽可能的分割,直到问题可以快速解决。对ForkJoinPool来说,与其它ExecutorService最重要的不同点是,它的工作线程会从其它工作线程的任务队列偷任务来执行。

Read more

Java并发源码分析 - ThreadPoolExecutor

为什么需要线程池?

  1. 避免在运行大量任务时,频繁的线程创建和销毁开销;
  2. 使资源的使用得到有效控制,避免创建过多的线程占用系统资源。
Read more

Java并发源码分析 - 锁

(注:文章里涉及到的代码分析,基于jdk1.7.0_10 Hotspot 64-Bit)

基本概念

Java同步机制除了内置的synchronized(包含Object.wait/notify)以外,还通过concurrent包提供了多种锁,包含ReentrantLock、Semaphore、ReentrantReadWriteLock等,以及跟Object.wait/notify类似语义的Condition接口。

Read more