sensitive-word-admin v1.3.0 发布 如何支持敏感词控台分布式部署?

这篇具有很好参考价值的文章主要介绍了sensitive-word-admin v1.3.0 发布 如何支持敏感词控台分布式部署?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

拓展阅读

sensitive-word-admin v1.3.0 发布 如何支持分布式部署?

sensitive-word-admin 敏感词控台 v1.2.0 版本开源

sensitive-word 基于 DFA 算法实现的高性能敏感词工具介绍

更多技术交流

sensitive-word-admin v1.3.0 发布 如何支持敏感词控台分布式部署?

业务背景

如果我们的敏感词部署之后,不会变化,那么其实不用考虑这个问题。

但是实际业务,敏感词总是随着时间不断变化的,所以我们需要支持敏感词的动态修改。

整体设计

pull vs push

以数据库存储自定义场景为例,如果页面修改了敏感词信息,那么如何通知到部署的多台敏感词客户端呢?

一般通知方式有两大类:

1)push 推送方式

修改时同时通知敏感词发生了变化,每个敏感词客户端接收到通知后,重新初始化敏感词信息。

优点是实时性比较高,缺点是需要引入额外的通知机制,需要通知的服务比较多时,也比较麻烦。

sensitive-word-admin v1.3.0 发布 如何支持敏感词控台分布式部署?

2)pull 拉取方式

修改后,直接落库数据库,每一个敏感词客户端自己定时拉取变更的信息。

这种方式有点是非常简单,缺点是存在一定的延迟性。

sensitive-word-admin v1.3.0 发布 如何支持敏感词控台分布式部署?

考虑到我们的场景可以允许分钟级的延迟,所以这里先实现定时拉取方式。

如何知道敏感词是否发生了变化?

定时拉取的方式比较简单,但是每一次拉取的话,如何知道是否需要重新初始化呢?

虽然每次的初始化的耗时还好,但是考虑到变更不是很频繁,所以有没有办法定时拉取时知道有没有变化呢?

回顾一下上一篇文章,我们设计的 word 表

create table word
(
    id int unsigned auto_increment comment '应用自增主键' primary key,
    word varchar(128) not null comment '单词',
    type varchar(8) not null comment '类型',
    status char(1) not null default 'S' comment '状态',
    remark varchar(64) not null comment '配置描述' default '',
    operator_id varchar(64) not null default 'system' comment '操作员名称',
    create_time timestamp default CURRENT_TIMESTAMP not null comment '创建时间戳',
    update_time timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间戳'
) comment '敏感词表' ENGINE=Innodb default charset=UTF8 auto_increment=1;
create unique index uk_word on word (word) comment '唯一索引';

根据更新时间可以吗?

如果我们所有的数据都不执行物理删除,那么直接根据 word 表的 update_time 即可判断。

但是如果一个数据真的被删除了,那么这种方式就不行了。

delete 的数据怎么办?

如果我们期望执行物理删除的话,那只有添加对应的日志表。

我们可以通过日志表的 update_time 来处理。

操作日志表

v1.2.0 的表设计

回顾一下 v1.2.0 表设计,如下:

create table word_log
(
    id int unsigned auto_increment comment '应用自增主键' primary key,
    batch_id varchar(128) not null comment '批次号',
    word varchar(128) not null comment '单词',
    type varchar(8) not null comment '类型',
    status char(1) not null default 'S' comment '单词状态。S:启用;F:禁用',
    remark varchar(64) not null comment '配置描述' default '',
    operator_id varchar(64) not null default 'system' comment '操作员名称',
    create_time timestamp default CURRENT_TIMESTAMP not null comment '创建时间戳',
    update_time timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间戳'
) comment '敏感词操作日志表' ENGINE=Innodb default charset=UTF8 auto_increment=1;
create index ix_word on word_log (word) comment '单词普通索引';
create index ix_batch_id on word_log (batch_id) comment '批次号普通索引';

枚举:

insert into lc_enum_mapping (table_name, column_name, `key`, label)  values ('word_log', 'status', 'S', '正常');
insert into lc_enum_mapping (table_name, column_name, `key`, label)  values ('word_log', 'status', 'F', '失效');

insert into lc_enum_mapping (table_name, column_name, `key`, label)  values ('word_log', 'type', 'ALLOW', '允许');
insert into lc_enum_mapping (table_name, column_name, `key`, label)  values ('word_log', 'type', 'DENY', '禁止');

表结构调整

我们对原来的表做一点调整。

调整后的建表语句

考虑到后续 sensitive-word 可能做精确的单个单词变化处理,我们最好可以知道每一次词内容的具体变化。

word 敏感词主题
word_before 变更前的单词
word_after 变更后的单词

调整后的建表语句:

drop table word_log;

create table word_log
(
    id int unsigned auto_increment comment '应用自增主键' primary key,
    batch_id varchar(128) not null comment '批次号',
    word varchar(128) not null comment '单词',
    word_before varchar(128) null comment '变更前单词',
    word_after varchar(128) null comment '变更后单词',
    type varchar(8) not null comment '类型',
    status char(1) not null default 'S' comment '单词状态',
    remark varchar(64) not null comment '配置描述' default '',
    operator_type varchar(16) not null default '' comment '操作类别',
    operator_id varchar(64) not null default 'system' comment '操作员名称',
    create_time timestamp default CURRENT_TIMESTAMP not null comment '创建时间戳',
    update_time timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间戳'
) comment '敏感词操作日志表' ENGINE=Innodb default charset=UTF8 auto_increment=1;
create index ix_word on word_log (word) comment '单词普通索引';
create index ix_batch_id on word_log (batch_id) comment '批次号普通索引';
create index ix_update_time on word_log (update_time) comment '更新时间普通索引';

添加操作类别(operator_type):

insert into lc_enum_mapping (table_name, column_name, `key`, label)  values ('word_log', 'operator_type', 'CREATE', '新增');
insert into lc_enum_mapping (table_name, column_name, `key`, label)  values ('word_log', 'operator_type', 'DELETE', '删除');
insert into lc_enum_mapping (table_name, column_name, `key`, label)  values ('word_log', 'operator_type', 'UPDATE', '更新');

例子

1)新增

新增 '敏感'

word 敏感
word_before null
word_after 敏感

2)修改

修改 '敏感',到 '敏感修改'

word 敏感
word_before 敏感
word_after 敏感修改
  1. 删除

删除 '敏感修改'

word 敏感修改
word_before 敏感修改
word_after null

刷新核心逻辑

我们启动一个定时任务,判断存在更新时,则重新初始化对应的敏感词信息。

package com.github.houbb.sensitive.word.admin.web.config;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.github.houbb.heaven.util.util.DateUtil;
import com.github.houbb.sensitive.word.admin.dal.entity.WordLog;
import com.github.houbb.sensitive.word.admin.service.service.WordLogService;
import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import groovy.util.logging.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 分布式部署的更新问题:
 *
 * 模式1:push
 * 实时性好,但是需要感知系统的存在。
 *
 * 模式2:pull
 * 存在延迟,但是无状态,简单。
 *
 * 这里采用模式2
 *
 * @since 1.2.0
 */
@Component
@Slf4j
public class MySensitiveWordScheduleRefresh {

    private static final Logger logger = LoggerFactory.getLogger(MySensitiveWordScheduleRefresh.class);

    @Autowired
    private SensitiveWordBs sensitiveWordBs;

    @Autowired
    private WordLogService wordLogService;

    /**
     * 刷新时间间隔
     * @since 1.3.0
     */
    @Value("${sensitive-word.refresh-interval-seconds}")
    private int refreshIntervalSeconds;

    @PostConstruct
    public void init() {
        logger.info("MySensitiveWordScheduleRefresh init with refreshIntervalSeconds={}", refreshIntervalSeconds);

        // 单线程定时调度。
        // TODO: 调整对应的 word_log 实现
        ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
        executorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    logger.info("MySensitiveWordScheduleRefresh start");

                    refresh();

                    logger.info("MySensitiveWordScheduleRefresh end");
                } catch (Exception e) {
                    logger.error("MySensitiveWordScheduleRefresh meet ex", e);
                }
            }
        }, refreshIntervalSeconds, refreshIntervalSeconds, TimeUnit.SECONDS);
    }

    /**
     * 更新词库
     *
     * 每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法。
     * 如果需要生效,则调用这个方法。
     *
     * 说明:重新初始化不影响旧的方法使用。初始化完成后,会以新的为准。
     */
    private void refresh() {
        // 延长10S,避免遗漏
        int timeDiffer = refreshIntervalSeconds + 10;
        // 判断当前一段时间内是否存在变化?
        Date date = DateUtil.addSecond(new Date(), -timeDiffer);

        Wrapper<WordLog> wordLogWrapper = new EntityWrapper<>();
        wordLogWrapper.gt("update_time", date);
        int count = wordLogService.selectCount(wordLogWrapper);
        if(count <= 0) {
            logger.info("MySensitiveWordScheduleRefresh 没有新增的变化信息,忽略更新。");
            return;
        }

        // 每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法,然后调用这个方法。
        // 后续可以优化为针对变化的初始化。
        sensitiveWordBs.init();
    }
    
}

sensitive-word.refresh-interval-seconds 属性指定了刷新的间隔,可配置。

小结

分布式环境下还是尽可能的追求架构的简洁性,这里只是一种实现的方式,也可以自己实现基于 push 的模式。

开源代码

sensitive-word-admin v1.3.0

参考资料

https://github.com/houbb/sensitive-word-admin

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-825464.html

到了这里,关于sensitive-word-admin v1.3.0 发布 如何支持敏感词控台分布式部署?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Failed to resolve: com.github.mcxtzhang:SwipeDelMenuLayout:V1.3.0

    在allprojects下的repositories闭包里面添加 jcenter() 和 maven {url \\\'https://jitpack.io\\\'} ,具体可以看你的第三方框架需要添加什么仓库,大多数都只需要上面两个。 我的build.gradle(Project)完整内容如下: 每个人都是有缺陷的,即使外表看起来很无暇。

    2024年02月11日
    浏览(26)
  • Kurator v0.3.0版本发布

    摘要: 2023年4月8日,Kurator正式发布v0.3.0版本。 本文分享自华为云社区《华为云 Kurator v0.3.0 版本发布!集群舰队助力分布式云统一管理》,作者:云容器大未来 。 2023年4月8日,Kurator正式发布v0.3.0版本。 Kurator 是华为云推出的分布式云原生开源套件,通过集成业界主流开源技

    2023年04月18日
    浏览(32)
  • Databend v1.1 版本发布!

    各位社区小伙伴们,Databend 于 2023 年 4 月 14 日迎来了 v1.1.0 版本的正式发布! 这次新版本是 Databend 发布1.0 版本之后的第一个大版本!相较于 v1.0.0 版本,开发者们一共新增了  1,616  次commit, 共计  505  个优化和修复,涉及  2,069  个文件变更,约  16 万  行代码修改。感谢

    2023年04月20日
    浏览(26)
  • Radix UI 3.0 发布,新的布局引擎

    Radix UI 3.0 刚刚发布,带来了新的布局引擎、新的组件和自定义调色板生成器,这个版本的发布是向着成为构建现代应用程序的最佳组件库迈出了一大步。我们将在本文中介绍主要亮点。 Radix Themes 配备了近 30 种颜色比例,每种都有自己的浅色、深色和 alpha 变体。在内部,颜

    2024年04月22日
    浏览(50)
  • 反控极域v1.0正式发布(开源)

    exe链接 GitHub - 反控极域v1.0 看完这篇的可以去看第二篇啦,这个1.0版本较旧没有2.0好用,发布在我个人主页里 本软件由 dh高中的无聊同学(划掉) 研发, 机房使用 极域课堂管理系统软件V6.0 2016 豪华版 软件功能: 1.给你的同学执行命令 2.给你的同学发送消息 3.看可爱的甘雨(

    2024年02月11日
    浏览(47)
  • 云原生周刊:Dapr v1.11 发布

    Kamaji Kamaji 可以大规模地部署和运行 Kubernetes 控制平面,而只需承担一小部分操作负担。Kamaji 的特别之处在于,控制平面组件是在一个单一的 pod 中运行,而不是在专用机器中运行。这种解决方案使运行多个控制平面的成本更低,更容易部署和操作。 Robusta KRR Robusta KRR(Kube

    2024年02月09日
    浏览(70)
  • DHorse v1.4.0 发布,基于 k8s 的发布平台

    新增特性 提供Fabric8客户端操作k8s(预览)的功能,可以通过指定-Dkubernetes-client=fabric8参数开启; Vue、React应用增加Pnpm、Yarn的构建方式; 支持Go、Flask、Django、Nuxt应用部署; 优化特性 副本指标数据保存为3天; 部署Nodejs应用时可以指定端口; 忽略搜索大小写匹配; 部署页面

    2024年02月07日
    浏览(28)
  • 发布原子化服务&HarmonyOS 3.0应用开发系列课

    原子化服务发布的国家和地区仅限于“中国大陆” 。正确(True) 发布元服务时需要创建证书,证书类型选择什么类型?B. 发布证书 元服务包由一个或多个HAP包组成,每个HAP包不得超过( ),以提供秒开体验。B. 10MB 元服务包名不能包含一些保留字段,以下哪个字段符合规范

    2024年02月04日
    浏览(28)
  • 与Sora同架构的Stable Diffusion 3.0 震撼发布

    Stability AI 发布了 Stable Diffusion 3,这款图像生成 AI 模型再次刷新了人们的认知。 这款由 Stability AI 倾力打造的文本变图模型,可是迄今为止最强大的“黑科技”!无论你想生成多主题的奇幻场景,还是高精度的风景写真,统统不在话下! Stability AI 强调了该版本的几个亮点,

    2024年03月10日
    浏览(43)
  • MathType在word中的安装使用方法(要配合microsoft公式3.0才能使用)(ps:弄得不好可能造成word中Ctrl+V失灵)

    可参考链接👉解决word中无法粘贴问题(Ctrl+V失灵问题) doc 是 Word2007 版本的后缀。版本比较旧,但是可以兼容到更老更多的计算机系统去,所以使用范围还是很广, 特别是在线投论文是很可能是要求上传doc文档 (同时压缩包是要求上传rar版本的),但是 不能随意插入公式

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包