# SceneTopic **Repository Path**: jmoon531/scene-topic ## Basic Information - **Project Name**: SceneTopic - **Description**: 解决场景题 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: DeductionCoupon-v1 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-08-30 - **Last Updated**: 2025-02-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 并发方案: 多线程并发处理,将文件放在阻塞队列中,每个线程每次负责处理一个文件。 为什么不使用Hash的方案,这样就不存在竞争了? 因为大客户的话单特别多,容易数据倾斜。如果使用Hash的方案,checkpoint的时候不用暂停所有的线程,因为状态不存在竞争,每个线程保存完状态之后就可以继续处理数据了。 如果文件大小极度不平衡,那么线程之间还是会产生数据倾斜,该怎么解决? - 方案一:利用缓冲区解耦读文件和数据处理两个过程,比如使用环形缓冲区,用几个线程专门负责读文件到缓存区,再用几个线程专门负责从缓冲区取数据并处理。当时这种方式不好记录每个线程的读取位置,checkpoint困难。 环形缓冲区可以利用阻塞队列实现,阻塞队列的每个元素是固定大小的块,这种方式的优点是实现简单,缺点是依赖jvm的垃圾回收。利用数组环形地进行读写可以重复利用内存空间,效率高那么一点。 - 方案二:让上游送话单文件的时候限制每个文件行数,比如最多10万行,多的行放到下一个文件。 崩溃恢复方案: 每隔一段时间做一次checkpoint,崩溃恢复的时候读取最近一次checkpoint,然后从checkpoint记录的位置重新开始继续读文件。checkpoint需要记录两类信息: - 每个线程读到哪个文件的哪一行了 - AtomicIntegerDesc中的值 具体怎么做? 序列化怎么做?