描述一下敏感词过滤算法DFA?

DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。
他是一种数据结构 一次性的把多个敏感词存储到了多个map中,在检索过程中会遍历每一个字符
所有的map中都维护了一个isEnd属性 如果isEnd为1 敏感词结尾 isEnd为0 非敏感词结尾
检索过程:
遍历文章中每一个字符,判断该字符在敏感词库中是否存在 不存在 结束 无敏感词
存在 获取该关键字的值的集合 获取isEnd属性 isEnd为1 结束 有敏感词
isEed为0 查找下一个字符 判断该字符的集合是否存在 存在 循环获取该关键字的值的集合
不存在 结束

描述一下seata中的AT模式原理?

保证最终一致性
第一阶段:
TM会向TC发起开启全局事务的请求 全局事务中的每一个RM就会被调用
RM会向TC注册分支事务 然后RM会去执行sql并且记录数据更新前后的快照(undolog日志)信息再向TC报告事务状态
第二阶段:
如果每个RM的分支事务都执行成功 全局事务整体会被提交,RM会删除快照(undolog日志)
如果有一个RM分支事务执行失败 全局事务会进行回滚 RM可以根据快照(undolog日志)完成数据回滚操作 恢复到数据更新以前的状态 再删除undolog日志

kafka的分区的作用是什么?(kafka高可用)

分区:
Kafka中的分区机制指的是将每个主题划分成多个分区(Partition),可以处理更多的消息。由于不受单台服务器的限制,可以处理更多的数据,一个topic中默认只有1个分区,这个可以在kafka的配置中(num.partitions=1)设置,每一个分区都是一个顺序的、不可变的消息队列, 并且可以持续的添加。分区中的消息都被分了一个序列号,称之为偏移量(offset),在每个分区中此偏移量都是唯一的。

作用:
kafka设置分区,能够处理更多的消息,不受单台服务器的限制。所有的消息将会被均匀的分布到不同的分区中,可以实现负载均衡和水平扩展,多个订阅者可以从一个或者多个分区中同时消费数据,以支撑海量数据处理能力。多个分区顺序写磁盘的总效率要比随机写内存要高,这也是Kafka高吞吐率的重要保证之一。

集群:
Kafka的服务器端由Broker的服务进程构成,即一个Kafka集群由多个Broker组成
这样如果集群中某一台机器宕机,其他机器上的 Broker 也依然能够对外提供服务。这其实就是 Kafka 提供高可用的手段之一

备份机制:
Kafka 中消息的备份又叫做 副本(Replica)
Kafka 定义了两类副本:领导者副本(Leader Replica)和 追随者副本(Follower Replica)

如果leader失效后,需要选出新的leader,选举的原则如下:
第一:选举时优先从ISR中选定,因为这个列表中follower的数据是与leader同步的 (同步)
第二:如果ISR列表中的follower都不行了,就只能从其他follower中选取 (异步)

极端情况,就是所有副本都失效了,这时有两种方案
第一:等待ISR中的一个活过来,选为Leader,数据可靠,但活过来的时间不确定 (一致性)
第二:选择第一个活过来的Replication,不一定是ISR中的,选为leader,以最快速度恢复可用性,但数据不一定完整 (高可用)

kafka如何保证消息的有序?

topic分区中消息只能由消费者组中的唯一一个消费者处理,所以消息肯定是按照先后顺序进行处理的。但是它也仅仅是保证Topic的一个分区顺序处理,不能保证跨分区的消息先后处理顺序。 所以,如果你想要顺序的处理Topic的所有消息,那就只提供一个分区。

应用场景:即时消息中的单对单聊天和群聊,保证发送方消息发送顺序与接收方的顺序一致
充值转账两个渠道在同一个时间进行余额变更,短信通知必须要有顺序

Kafka 如何保证消息可靠性?

保证消息的可靠性就是 保证消息不丢失 保证消息有序(以上) 避免消息被重复消费

生产者在发送消息的时候,有一个ack消息确认机制,他有3个参数,acks=0,就是生产者写入消息之前不会等待响应,消息可能丢失,速度最快。 acks=1(默认),只要集群中leader节点收到消息,生产者就会收到来自服务器的响应,推荐选择。acks=all,当所有节点全部收到消息之后,生产者才会收到响应。他里面还有一个retries重试机制,生产者从服务器收到的错误有可能是临时性错误,retries参数的值可以决定生产者重发消息的次数,达到这个次数,才会放弃重试,返回错误,默认等待100ms。

kafka不会像其他JMS队列那样需要得到消费者的确认,消费者可以使用kafka来追踪消息在分区的位置(偏移量)
消费者会往一个叫做_consumer_offset的特殊主题发送消息,消息里包含了每个分区的偏移量。如果消费者发生崩溃或有新的消费者加入群组,就会触发再均衡
比如说某消费者挂掉以后,会发生再均衡,该消费者负责的分区会被其他消费者进行消费
再均衡后也不可避免会出现一些问题
如果提交偏移量小于客户端处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息就会被重复处理。 (重复消费)
如果提交的偏移量大于客户端的最后一个消息的偏移量,那么处于两个偏移量之间的消息将会丢失。(丢失)

kafak提交偏移量有2种方式:自动 手动
自动:当enable.auto.commit被设置为true,提交方式就是让消费者自动提交偏移量,每隔5秒消费者会自动把从poll()方法 接收的最大偏移量提交上去
手动:3种方式 (缺点阻塞 使用异步提交api缓解)
提交当前偏移量 (同步提交) 应用程序决定 有丢失风险 有重试 提交失败记录错误日志
异步提交 (缺点 提交失败不会重试)
同步和异步组合提交 (推荐)