网站设计怎么保持风格一致,2018年深圳建设网站公司,杭州建设局网站官网,长春快速建站模板业务场景#xff1a; 批量消费Kafka数据#xff0c;一个批次针对同一条数据做新增和修改操作#xff0c;当前一条数据还未更新完成#xff0c;后一条数据也同步修改#xff0c;数据就存在异常#xff1b;
单机模式#xff1a; #xff08;一#xff09…业务场景 批量消费Kafka数据一个批次针对同一条数据做新增和修改操作当前一条数据还未更新完成后一条数据也同步修改数据就存在异常
单机模式 一、直接拼接唯一的条件作为字符串判断两条数据是一条数据的条件把它放入常量池intern方法之后对常量池字符串加锁保证同一条数据只会一个一个修改
单机/集群模式 一、使用Redis中间件加锁同一条数据先阻塞但这种方式的Redis锁也需要加在判断两条数据属于同一条数据的查询条件上 二、发送消息到同一个topic使用线程池数组队列阻塞同一条修改的数据
/*** 新增Lindorm阻塞任务线程池** return*/Beanpublic ExecutorService[] lindormExecutorService() {Logger logger LoggerFactory.getLogger(GpsServiceApiController.class);ExecutorService[] executorServices new ExecutorService[8];for (int i 0; i 8; i) {executorServices[i] createExecutorService(logger, 1, 10, i, deleteLindorm);}return executorServices;}private ExecutorService createExecutorService(Logger logger, int threadMaxPoolSize, int threadQueueCapacitySize, int i, String name) {return new ThreadPoolExecutor(threadMaxPoolSize, threadMaxPoolSize,0L, TimeUnit.MILLISECONDS,//如果使用优先级队列PriorityBlockingQueue需要实现Compare比较方法new LinkedBlockingQueue(threadQueueCapacitySize),new ThreadFactoryBuilder().setNameFormat(pool- i - name -thread-%d).build(),(r, executor) - {try {long startTime System.currentTimeMillis();executor.getQueue().put(r);logger.info(too many task to handle,blocking the task {} ms, System.currentTimeMillis() - startTime);} catch (InterruptedException e) {e.printStackTrace();}});}lindormExecutorService[Hashing.consistentHash(查询条件字符串.hashCode(), lindormExecutorService.length)].execute(() - {try {} catch (Exception e) {log.warn(xxxxx{}, param, e);}});这样也能保证同一条数据被阻塞