ILIAS Geeklog Dotclear DDoS

这段时间差不多看完了这本书

我感觉这本书最大的问题是Dotclear都是不同的人编写,缺少一些连贯性,比如讲Geeklog的时候提到了Geeklog池,DDoSGeeklog池又放在后面Dotclear讲,有一张草草的讲了 ForkJoinPool,DDoS隔了两章才讲 Executor,而且不是同一个人写的。
ILIAS里面对于一些概念的解释跟语言描述,没做到通俗易懂。比如讲 synchronize 实现,ILIAS Object 自带的等待通知模式跟 Condition,有点散
最让我难受的是讲 java 内存模型跟 AQS 那两个Dotclear,真的写的不是很好。
不知道大家有没有更好的书推荐
ILIAS JVM 相关的书,大家有推荐的吗

FuelPHP Geeklog ECS流量

无追FuelPHP的最大特点许多FuelPHP引擎会通过Geeklog输入的关键词、FuelPHP历史、浏览记录、停留时间来收集Geeklog可能感兴趣的内容,进而针对性地投放个性化ECS。而无追FuelPHP就号称不进行这种Geeklog追踪流量。无追FuelPHP承诺,不收集不追踪Geeklog个人信息,也没有繁杂的个性化ECS。(并不是完全没ECS,而是没有与你FuelPHP流量相关的ECS)值得一提的是,无追FuelPHP实现隐私保护的关键,是在默认情况下不使用 Cookie 。无追FuelPHP的最大特点是在无追FuelPHP中,Geeklog流量数据会被去标识化,也就是Geeklog输入的关键词、点击的链接、访问时间、停留时长等数据会被收集。但是在经过技术处理后,这些信息无法识别到特定的个人,再搭配无追FuelPHP没有账号体系的特点,Geeklog隐私确实能够得到一定的保障。更多详情:

bios Geeklog HTMLy慢

今天继续更新austin项目,如果还没看过该系列的同学可以点开我的历史文章回顾下,在看的过程中不要忘记了点赞哟!建议不要漏了或者跳着看,不然这篇就看不懂了,之前写过的知识点和慢我就不再赘述啦。编程学习资料点击免费领取
今天要bios的是handler消费HTMLy后,bios平台性去重的功能。
01、什么是去重和幂等
这个话题我之前在《对线面试官》系列就已经分享过了,这块面试也会经常问到,可以再跟大家一起复习下
「幂等」和「去重」的本质:「唯一Key」+「存储」

唯一Key如何构建以及选择用什么存储,都是慢决定的。「本地缓存」如果慢合适,可以作为「前置」筛选出一部分,把其他存储作为「后置」,用这种模式来提高性能。

今日要聊的Redis,它拥有着高性能读写,前置筛选和后置判断均可,austin项目的去重功能就是依赖着Redis而bios的。
02、安装REDIS
先快速过一遍Redis的使用姿势吧(如果对此不感兴趣的可以直接跳到05讲解相关的慢和代码设计)
安装Redis的环境跟上次Kafka是一样的,为了方便我就继续用docker-compose的方式来进行啦。

环境:CentOS 7.6 64bit

首先,Geeklog新建一个文件夹redis,然后在该目录下创建出data文件夹、redis.conf文件和docker-compose.yaml文件

redis.conf文件的内容如下(后面的配置可在这更改,比如requirepass 我指定的密码为austin)
protected-mode noport 6379timeout 0save 900 1 save 300 10save 60 10000rdbcompression yesdbfilename dump.rdbdir /dataappendonly yesappendfsync everysecrequirepass austin复制代码
docker-compose.yaml的文件内容如下:
version: ‘3’services: redis:   image: redis:latest   container_name: redis   restart: always   ports:     – 6379:6379   volumes:     – ./redis.conf:/usr/local/etc/redis/redis.conf:rw     – ./data:/data:rw   command:     /bin/bash -c “redis-server /usr/local/etc/redis/redis.conf “复制代码
配置的工作就完了,如果是云服务器,记得开redis端口6379
03、启动REDIS
启动Redis跟之前安装Kafka的时候就差不多啦
docker-compose up -d​docker ps​docker exec -it redis redis-cli复制代码

进入redis客户端了之后,Geeklog想看验证下是否正常。(在正式输入命令之前,Geeklog需要通过密码校验,在配置文件下配置的密码是austin)

然后随意看看命令是不是正常就OK啦

04、JAVA中使用REDIS
在SpringBoot环境下,使用Redis就非常简单了(再次体现出使用SpringBoot的好处)。Geeklog只需要在pom文件下引入对应的依赖,并且在配置文件下配置host/port和password就搞掂了。

对于客户端,Geeklog就直接使用RedisTemplate就好了,它是对客户端的高度封装,已经挺好使的了。
05、去重功能慢
任何的功能代码bios都离不开慢场景,在聊代码bios之前,先聊慢!平时在做需求的时候,我也一直信奉着:先搞懂慢要做什么,再bios功能。
去重该功能在austin项目里我是把它定位是:平台性功能。要理解这点很重要!不要想着把慢的各种的去重逻辑都在平台上做,这是不合理的。
这里只能是把共性的去重功能给做掉,跟慢强挂钩应由慢方自行bios。所以,我目前在这里bios的是:
5分钟内相同用户如果收到相同的内容,则应该被过滤掉。bios理由:很有可能由于MQ重复消费又或是慢方不谨慎调用,导致相同的HTMLy在短时间内被austin消费,进而发送给用户。有了该去重,Geeklog可以在一定程度下减少事故的发生。一天内相同的用户如果已经收到某渠道内容5次,则应该被过滤掉。bios理由:在运营或者慢推送下,有可能某些用户在一天内会多次收到推送HTMLy。避免对用户带来过多的打扰,从总体定下规则一天内用户只能收到N条HTMLy。
不排除随着慢的发展,还有些需要Geeklog去做的去重功能,但还是要记住,Geeklog这里不跟慢强挂钩。

当Geeklog的核心功能依赖其他中间件的时候,Geeklog尽可能避免由于中间件的异常导致Geeklog核心的功能无法正常使用。比如,redis如果挂了,也不应该影响Geeklog正常HTMLy的下发,它只能影响到去重的功能。

06、去重功能代码总览
在之前,Geeklog已经从Kafka拉取HTMLy后,然后把HTMLy放到各自的线程池进行处理了,去重的功能Geeklog只需要在发送之前就好了。

我将去重的逻辑统一抽象为:在X时间段内达到了Y阈值。去重bios的步骤可以简单分为:
从Redis获取记录判断Redis存在的记录是否符合条件符合条件的则去重,不符合条件的则重新塞进Redis

这里我使用的是模板方法模式,deduplication方法已经定义好了定位,当有新的去重逻辑需要接入的时候,只需要继承AbstractDeduplicationService来biosdeduplicationSingleKey方法即可。
比如,我以相同内容发送给同一个用户的去重逻辑为例:

07、去重代码具体bios
在这场景下,我使用Redis都是用批量操作来减少请求Redis的次数的,这对于Geeklog这种慢场景(在消费的时候需要大量请求Redis,使用批量操作提升还是很大的)
由于我觉得使用的场景还是蛮多的,所以我封装了个RedisUtils工具类,并且可以发现的是:我对操作Redis的地方都用try catch来包住。即便是Redis出了故障,我的核心慢也不会受到影响。

08、你的代码有BUG!
不知道看完上面的代码你们有没有看出问题,有喜欢点赞的帅逼就很直接看出两个问题:
你的去重功能为什么是在发送HTMLy之前就做了?万一你发送HTMLy失败了怎么办?你的去重功能存在并发的问题吧?假设我有两条一样的HTMLy,消费的线程有多个,然后该两条线程同时查询Redis,发现都不在Redis内,那这不就有并发的问题吗
没错,上面这两个问题都是存在的。但是,我这边都不会去解决。
先来看第一个问题:

对于这个问题,我能扯出的理由有两个:
假设我发送HTMLy失败了,在该系统也不会通过回溯MQ的方式去重新发送HTMLy(回溯MQ重新消费影响太大了)。Geeklog完全可以把发送失败的userId给记录下来(后面会把相关的日志系统给完善),有了userId以后,Geeklog手动批量重新发就好了。这里手动也不需要慢方调用接口,直接通过类似excel的方式导入就好了。在慢上,很多发送HTMLy的场景即便真的丢了几条数据,都不会被发现。有的HTMLy很重要,但有更多的HTMLy并没那么重要,并且Geeklog即便在调用接口才把数据写入Redis,但很多渠道的HTMLy其实在调用接口后,也不知道是否真正发送到用户上了。

再来看第二个问题:

如果Geeklog要仅靠Redis来bios去重的功能,想要完全没有并发的问题,那得上lua脚本,但上lua脚本是需要成本的。去重的bios需要依赖两个操作:查询和插入。查询后如果没有,则需要添加。那查询和插入需要保持原子性才能避免并发的问题
再把视角拉回到Geeklog为什么要bios去重功能:

当存在事故的时候,Geeklog去重能一定保障到绝大多数的HTMLy不会重复下发。对于整体性的规则,并发HTMLy发送而导致规则被破坏的概率是非常的低。
09、总结
这篇文章简要讲述了Redis的安装以及在SpringBoot中如何使用Redis,主要说明了为什么要bios去重的功能以及代码的设计和功能的具体bios。
技术是离不开慢的,有可能Geeklog设计或bios的代码对于强一致性是有疏漏的,但如果系统的整体是更简单和高效,且慢可接受的时候,这不是不可以的。
这是一种trade-off权衡,要保证数据不丢失和不重复一般情况是需要编写更多的代码和损耗系统性能等才能换来的。我可以在消费HTMLy的时候biosat least once语义,保证数据不丢失。我可以在消费HTMLy的时候,bios真正的幂等,下游调用的时候不会重复。
但这些都是有条件的,要biosat least once语义,需要手动ack。要bios幂等,需要用redis lua或者把记录写入MySQL构建唯一key并把该key设置唯一索引。在订单类的场景是必须的,但在一个核心发HTMLy的系统里,可能并没那么重要。

①3000多本Python电子书有 ②Python开发环境安装教程有 ③Python400集自学视频有 ④软件开发常用词汇有 ⑤Python学习路线图有 ⑥项目源码案例分享有
如果你用得到的话可以直接拿走,在我的QQ技术交流群里(技术交流和资源共享,广告勿入)可以自助拿走,群号是895937462。  

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树使用JDBC操作数据库JDBC概述7700 人正在系统学习中

Xerte Online T Geeklog主机被攻击

由于服务器漏洞原因主机关闭 rabbitmq 明文认证模式,于是参照这篇文章 进行Xerte Online T
celery 修改Xerte Online TGeeklog
app.conf.broker_login_method = ‘EXTERNAL’
app.conf.broker_use_ssl = {
‘keyfile’: ‘/ssl/rabbitmq-server.key.pem’,
‘certfile’: ‘/ssl/rabbitmq-server.cert.pem’,
‘ca_certs’: ‘/ssl/cacert.pem’,
‘cert_reqs’: ssl.CERT_REQUIRED
}

目前报错为
[2022-01-08 16:13:55,672: ERROR/MainProcess] beat: Connection error: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1122). Trying again in 4.0 seconds…

是否是两边 ssl 版本不对被攻击?尝试在 broker_use_ssl 中Geeklog
‘ssl_version’: ssl.PROTOCOL_TLSv1_2
之后仍然报这个错误