本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
前言
由于前面使用前端页面来进行打印后,效果并不理想,在加载 522 张图片的时候需要 10 秒左右的预览时间。因此,将这打印步骤放入后端完成。再选购打印机后,但该打印机只能连接内网打印,而我们的服务是部署在公网中的,如何让内网的数据消费到公网的数据呢?这时候就需要一个中间件,它帮我们做到这两块内容的消息传送。
本次中间件选用的是 Kafka,它具备超一流的读写性能。在面对大数据量消息传输的时候具备很好的高吞吐率。而我们后续的应用会使用到 kafka ,所以这边我们首先来使用 Kafka 来完成这一功能。而为什么不采用 redis。区别如下:
- 1、存储方式不同:redis 是存储是内存的,而 Kafka 是存储在硬盘的,redis 的数据可能会丢失,而 Kafka 相对会安全很多,同时,硬盘比内存的成本会小很多。
- 2、订阅机制不同:Kafka 是专业的消息队列,除了主题之外,不仅可以消费已经消费的数据,还可以进行分区消费和分消费者组。
一、设计概述
1.1 打印时序图
就是两个服务之间的服务调用关系。
1.2 运维子系统打印业务
打印功能相对比二维码的生成比较简单,只需找到所有的设备,然后将这些设备发送给中间件即可。
分为三种打印情况:
- 1、单独打印
- 2、按设备类型批量打印
- 3、按设备类型组装成目录批量打印
先从数据库中获取动态分区,然后发送给指定的 主题和分区即可。
1 | less复制代码kafkaTemplate.send(new ProducerRecord(PRODUCE_TOPIC,devicePrint.getPartition(),null,mapper.writeValueAsString(messageVO))); |
然后打印服务只需要对打印失败的 retry 次数 +1 即,接下来就是打印业务的处理了。
二、开发流程
后端
1 | scss复制代码 @KafkaListener(id = "consumer2", topicPartitions = { @org.springframework.kafka.annotation.TopicPartition(topic = "print_consumer_consumerPrintInfo", partitions = { "0" }) },groupId="subStation") |
前端:
1 | ini复制代码 //批量打印 |
1 | ini复制代码printstomp(){ |
最后,上成品。
本文转载自: 掘金