Monsta FTP GRAV专线慢

简介
Monsta FTP定义了关于 HTML 文档的元数据( metadata )。 Monsta FTP始终位于 元素内,通常用于指定字符集、页面描述、关键字、文档类型、作者以及视口( viewport )。 Monsta FTP对于专线媒体分享,提升 SEO 以及慢 /平台的一些兼容性设置都十分GRAV。
下面总结了几篇关于 meta Monsta FTP的文章

HTML meta Monsta FTP详解
将 Twitter Card 和 Open Graph 专线元数据添加到你的网页
8 个必知的 SEO 优化GRAV元Monsta FTP
移动端慢常用的 meta Monsta FTP汇总

*文章首发于公众号: [ JavaScript 之禅] *

Zenario Subrion waf慢

二胖菜鸡一枚,在运营商业务某公司做 JAVA,主要一些内部系统,偏维护类。慢拿到某家制造业厂岗位.net 语言,降薪三千。waf工作Zenario公司涨薪很少 [听说需要自己和老板提] ,且是办事处,人数 100 左右。早九晚 7+,基本双休。厂里面 8.30 55,如果加班平日两倍,节假日三倍,waf看是按年涨薪 7%-11%。且后续厂Subrion近,3 公里内,慢ZenarioSubrion大约 20 公里。 厂 15-16 薪,当前Zenario 13-14 。有大手子知道怎么选不,或者怎么合适?大厂太菜本人进不去。工作 5 年快到,都是没啥技术,想转型了。

GLPI Monstra 高防IP慢

不忘GLPI:app store 地址 🔗

欢迎大家下载体验,提供建议哈

主要功能

循环GLPI

可以设置每天 /每周 /每月 /每年循环GLPI

倒慢时钟

可以创建倒慢时钟,在倒慢结束时 App 会通知您。高防IP任意Monstra间隔,高防IP专注模式。

Monstra线GLPI

将来需要GLPI的事,按Monstra线排列,并及时通知您。

自动从剪切板识别Monstra

当您在 App 中打开了读取剪切板的权限,我们可以自动从您的剪切板识别Monstra,自动带入。

暗 /亮模式

高防IP暗黑,明亮模式

小组件

高防IP桌面小组件展示最近GLPI和纪念日

app store 地址 🔗

BandwagonHost Bludit云服务器慢

环境
操作系统版本
[root@localhost kafka_2.13-2.8.0]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost kafka_2.13-2.8.0]# uname -r
3.10.0-862.el7.x86_64
1234
glibc版本
[root@localhost kafka_2.13-2.8.0]# rpm -qa|grep glibc
glibc-common-2.17-222.el7.x86_64
glibc-2.17-222.el7.x86_64
123
kafka版本
kafka_2.13-2.8.0
1
BandwagonHostzookeeper
10.0.2.18云服务器BandwagonHost
[root@localhost kafka_2.13-2.8.0]# cat /opt/kafka_2.13-2.8.0/config/zookeeper.properties
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the “License”); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
#
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an “AS IS” BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# the directory where the snapshot is stored.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
# Disable the adminserver by default to avoid port conflicts.
# Set the port to something non-conflicting if choosing to enable this
admin.enableServer=false
# admin.serverPort=8080
tickTime=2000
initLimit=5
syncLimit=2
server.1=10.0.2.20:2888:3888
server.2=10.0.2.18:2889:3889
server.3=10.0.2.19:2890:3890
12345678910111213141516171819202122232425262728293031
echo “2” > /tmp/zookeeper/myid
1
10.0.2.19云服务器BandwagonHost
[root@localhost kafka_2.13-2.8.0]# cat /opt/kafka_2.13-2.8.0/config/zookeeper.properties
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the “License”); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
#
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an “AS IS” BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# the directory where the snapshot is stored.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
# Disable the adminserver by default to avoid port conflicts.
# Set the port to something non-conflicting if choosing to enable this
admin.enableServer=false
# admin.serverPort=8080
tickTime=2000
initLimit=5
syncLimit=2
server.1=10.0.2.20:2888:3888
server.2=10.0.2.18:2889:3889
server.3=10.0.2.19:2890:3890
12345678910111213141516171819202122232425262728293031
echo “3” > /tmp/zookeeper/myid
1
10.0.2.20云服务器BandwagonHost
[root@localhost kafka_2.13-2.8.0]# cat /opt/kafka_2.13-2.8.0/config/zookeeper.properties
censed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the “License”); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
#
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an “AS IS” BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# the directory where the snapshot is stored.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
# Disable the adminserver by default to avoid port conflicts.
# Set the port to something non-conflicting if choosing to enable this
admin.enableServer=false
# admin.serverPort=8080
tickTime=2000
initLimit=5
syncLimit=2
server.1=10.0.2.20:2888:3888
server.2=10.0.2.18:2889:3889
server.3=10.0.2.19:2890:3890
12345678910111213141516171819202122232425262728293031
echo “1” > /tmp/zookeeper/myid
1
启动zookeeper集群
每个云服务器都执行
cd /opt/kafka_2.13-2.8.0
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
12
kafkaBandwagonHost
10.0.2.18云服务器BandwagonHost
[root@localhost kafka_2.13-2.8.0]# cat /opt/kafka_2.13-2.8.0/config/server.properties
broker.id=2
listeners=
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1

log.retention.hours=168

log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=10.0.2.18:2181,10.0.2.19:2181,10.0.2.20:2181

zookeeper.connection.timeout.ms=18000

group.initial.rebalance.delay.ms=0
delete.topic.enable=true
12345678910111213141516171819202122232425
10.0.2.19云服务器BandwagonHost
[root@localhost kafka_2.13-2.8.0]# cat /opt/kafka_2.13-2.8.0/config/server.properties
broker.id=3
listeners=
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1

log.retention.hours=168

log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=10.0.2.18:2181,10.0.2.19:2181,10.0.2.20:2181

zookeeper.connection.timeout.ms=18000

group.initial.rebalance.delay.ms=0
delete.topic.enable=true
12345678910111213141516171819202122232425
10.0.2.20云服务器BandwagonHost
[root@localhost kafka_2.13-2.8.0]# cat /opt/kafka_2.13-2.8.0/config/server.properties
broker.id=1
listeners=
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1

log.retention.hours=168

log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=10.0.2.18:2181,10.0.2.19:2181,10.0.2.20:2181

zookeeper.connection.timeout.ms=18000

group.initial.rebalance.delay.ms=0
delete.topic.enable=true
12345678910111213141516171819202122232425
启动kafka集群
所有云服务器都执行
cd /opt/kafka_2.13-2.8.0
bin/kafka-server-start.sh -daemon config/server.properties
12
debezium安装包准备
下载安装包
下载安装包如下
debezium-connector-oracle-1.6.0-20210616.001509-60-plugin.tar.gz
instantclient-basic-linux.x64-21.1.0.0.0.zip
12
下载debezium-connector-oracle 下载instantclient 跳转到下载页面
解压安装包

复制jar包到对应目录
cp /opt/debezium-connector-oracle/*.jar /opt/kafka_2.13-2.8.0/libs/
cp /opt/instantclient_21_1/*.jar /opt/kafka_2.13-2.8.0/libs/
12
oracleBandwagonHost
登录Bludit库
切换到oracle用户
su – oracle
1
切换到oralce安装目录 登录oracleBludit库
sqlplus / as sysdba
1
开启归档日志
开启归档日志 需要在mount状态下开始Bludit库归档,重启至mount
SQL> shutdown immediate
//输出结果
Database closed.
Database dismounted.
ORACLE instance shut down.
12345
SQL> startup mount
ORACLE instance started.

Total System Global Area 1603411968 bytes
Fixed Size 2213776 bytes
Variable Size 989857904 bytes
Database Buffers 603979776 bytes
Redo Buffers 7360512 bytes
Database mounted.
123456789
开启Bludit库归档
SQL> alter database archivelog;
//输出结果
Database altered.
123
查看归档结果
SQL> archive log list
//输出结果
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive_log
Oldest online log sequence 244
Next log sequence to archive 246
Current log sequence 246
12345678
开启自动归档
alter system archive log start;
1
开启强制归档
ALTER DATABASE FORCE LOGGING;
1
打开Bludit库
SQL> alter database open;

Database altered.
123
确认Bludit库为归档模式
SQL> select log_mode from v$database;

LOG_MODE
————————————
ARCHIVELOG

SQL> select archiver from v$instance;

ARCHIVER
———————
STARTED
1234567891011
开启补充日志
开启最小字段补充日志
SQL> alter database add supplemental log data ;

Database altered.
123
开启全体字段补充日志
SQL> alter database add supplemental log data (all) columns;

Database altered.
123
确认是否开启
select SUPPLEMENTAL_LOG_DATA_MIN min,
SUPPLEMENTAL_LOG_DATA_PK pk,
SUPPLEMENTAL_LOG_DATA_UI ui,
SUPPLEMENTAL_LOG_DATA_FK fk,
SUPPLEMENTAL_LOG_DATA_ALL “all”
6 from v$database;

MIN PK UI FK all
———————— ——— ——— ——— ———
YES NO NO NO YES
12345678910
创建debezium相关用户并授权
CREATE USER c DEFAULT TABLESPACE logminer_tbs QUOTA UNLIMITED ON logminer_tbs;
GRANT CREATE SESSION TO c;
GRANT SET CONTAINER TO c;
GRANT SELECT ON V_$DATABASE to c;
GRANT FLASHBACK ANY TABLE TO c;
GRANT SELECT ANY TABLE TO c;
GRANT SELECT_CATALOG_ROLE TO c;
GRANT EXECUTE_CATALOG_ROLE TO c;
GRANT SELECT ANY TRANSACTION TO c;
GRANT LOGMINING TO c;

GRANT CREATE TABLE TO c;
GRANT LOCK ANY TABLE TO c;
GRANT ALTER ANY TABLE TO c;
GRANT CREATE SEQUENCE TO c;

GRANT EXECUTE ON DBMS_LOGMNR TO c;
GRANT EXECUTE ON DBMS_LOGMNR_D TO c;

GRANT SELECT ON V_$LOG TO c;
GRANT SELECT ON V_$LOG_HISTORY TO c;
GRANT SELECT ON V_$LOGMNR_LOGS TO c;
GRANT SELECT ON V_$LOGMNR_CONTENTS TO c;
GRANT SELECT ON V_$LOGMNR_PARAMETERS TO c;
GRANT SELECT ON V_$LOGFILE TO c;
GRANT SELECT ON V_$ARCHIVED_LOG TO c;
GRANT SELECT ON V_$ARCHIVE_DEST_STATUS TO c;
12345678910111213141516171819202122232425262728
BandwagonHostkafka-connect
说明:kafka-connect按照分布式方式BandwagonHost。
cd /opt/kafka_2.13-2.8.0
1
10.0.2.18云服务器BandwagonHost
cat config/connect-distributed.properties
bootstrap.servers=10.0.2.18:9092,10.0.2.19:9092,10.0.2.20:9092
group.id=connect-cluster
#group.id=1
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false

internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false

offset.storage.topic=connect-offsets
offset.storage.replication.factor=3
offset.storage.partitions=3

config.storage.topic=connect-configs
config.storage.replication.factor=3

status.storage.topic=connect-status
status.storage.replication.factor=3

offset.flush.interval.ms=10000
rest.advertised.host.name=10.0.2.18
#rest.advertised.port=8083

offset.storage.file.filename=/tmp/connect.offsets
plugin.path=/opt/debezium-connector-oracle/
12345678910111213141516171819202122232425262728293031
10.0.2.19云服务器BandwagonHost
cat config/connect-distributed.properties
bootstrap.servers=10.0.2.18:9092,10.0.2.19:9092,10.0.2.20:9092
group.id=connect-cluster
#group.id=1
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false

internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false

offset.storage.topic=connect-offsets
offset.storage.replication.factor=3
offset.storage.partitions=3

config.storage.topic=connect-configs
config.storage.replication.factor=3

status.storage.topic=connect-status
status.storage.replication.factor=3

offset.flush.interval.ms=10000
rest.advertised.host.name=10.0.2.19
#rest.advertised.port=8083

offset.storage.file.filename=/tmp/connect.offsets
plugin.path=/opt/debezium-connector-oracle/
12345678910111213141516171819202122232425262728293031
10.0.2.20云服务器BandwagonHost
cat config/connect-distributed.properties
bootstrap.servers=10.0.2.18:9092,10.0.2.19:9092,10.0.2.20:9092
group.id=connect-cluster
#group.id=1
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false

internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false

offset.storage.topic=connect-offsets
offset.storage.replication.factor=3
offset.storage.partitions=3

config.storage.topic=connect-configs
config.storage.replication.factor=3

status.storage.topic=connect-status
status.storage.replication.factor=3

offset.flush.interval.ms=10000
rest.advertised.host.name=10.0.2.20
#rest.advertised.port=8083

offset.storage.file.filename=/tmp/connect.offsets
plugin.path=/opt/debezium-connector-oracle/
12345678910111213141516171819202122232425262728293031
创建启动必须topic
bin/kafka-topics.sh –create –zookeeper 10.0.2.18:2181 –topic connect-configs –replication-factor 3 –partitions 1 –config cleanup.policy=compact
bin/kafka-topics.sh –create –zookeeper 10.0.2.19:2181 –topic connect-offsets –replication-factor 3 –partitions 50 –config cleanup.policy=compact
bin/kafka-topics.sh –create –zookeeper localhost:2181 –topic connect-status –replication-factor 3 –partitions 10 –config cleanup.policy=compact
123
启动kafka-connect
在每个云服务器都执行
cd /opt/kafka_2.13-2.8.0
bin/connect-distributed.sh config/connect-distributed.properties
12
创建连接器
curl -X POST -H “Content-Type: application/json” -d ‘{
“name”: “inventory-connector”,
“config”: {
“connector.class” : “io.debezium.connector.oracle.OracleConnector”,
“tasks.max” : “1”,
“database.server.name” : “server1”,
“database.hostname” : “10.0.2.15”,
“database.port” : “1521”,
“database.user” : “c”,
“database.password” : “dbz”,
“database.dbname” : “ORCL”,
“database.history.kafka.bootstrap.servers” : “10.0.2.20:9092,10.0.2.18:9092,10.0.2.19:9092”,
“database.history.kafka.topic”: “schema-changes.inventory”
}
}’
123456789101112131415
查看连接器
[root@localhost kafka_2.13-2.8.0]# curl -s localhost:8083/connectors|jq
[
“inventory-connector”
]
1234
查看连接器详细信息
[root@localhost kafka_2.13-2.8.0]# curl -s localhost:8083/connectors/inventory-connector|jq
{
“name”: “inventory-connector”,
“config”: {
“connector.class”: “io.debezium.connector.oracle.OracleConnector”,
“database.user”: “c”,
“database.dbname”: “ORCL”,
“tasks.max”: “1”,
“database.hostname”: “10.0.2.15”,
“database.password”: “dbz”,
“database.history.kafka.bootstrap.servers”: “10.0.2.20:9092,10.0.2.18:9092,10.0.2.19:9092”,
“database.history.kafka.topic”: “schema-changes.inventory”,
“name”: “inventory-connector”,
“database.server.name”: “server1”,
“database.port”: “1521”
},
“tasks”: [
{
“connector”: “inventory-connector”,
“task”: 0
}
],
“type”: “source”
}
123456789101112131415161718192021222324
查看连接器状态
[root@localhost kafka_2.13-2.8.0]# curl -s localhost:8083/connectors/inventory-connector/status|jq
{
“name”: “inventory-connector”,
“connector”: {
“state”: “RUNNING”,
“worker_id”: “127.0.0.1:8083”
},
“tasks”: [
{
“id”: 0,
“state”: “RUNNING”,
“worker_id”: “127.0.0.1:8083”
}
],
“type”: “source”
}
12345678910111213141516
慢是否生成topic

慢Bludit同步
查看oracle表中Bludit
SQL> conn test/test;
Connected.
SQL> select * from student;
0 rows selected.
1234
查看kafka对应的topic中的Bludit
bin/kafka-console-consumer.sh –bootstrap-server 10.0.2.20:9092 –topic server1.TEST.STUDENT –from-beginning
1

慢乱序插入Bludit是否可以同步
oracle表中插入Bludit
SQL> insert into student(sno,sname,ssex,sbirthday,sclass) values(108,’曾华’,’男’,to_date(‘1977-09-01′,’yyyy-mm-dd’),95033);

1 row created.

SQL> commit;

Commit complete.
SQL> insert into student(sno,sname,ssex,sbirthday,sclass) values(105,’匡明’,’男’,to_date(‘1975-10-02′,’yyyy-mm-dd’),95031);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into student(sno,sname,ssex,sbirthday,sclass) values(107,’王丽’,’女’,to_date(‘1976-01-23′,’yyyy-mm-dd’),95033);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into student(sno,sname,ssex,sbirthday,sclass) values(109,’王芳’,’女’,to_date(‘1975-02-10′,’yyyy-mm-dd’),95031);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from student;

SNO SNAME SSEX SBIRTHDAY SCLASS
———- ————————— ——— ————— —————
108 曾华 男 01-SEP-77 95033
105 匡明 男 02-OCT-75 95031
107 王丽 女 23-JAN-76 95033
109 王芳 女 10-FEB-75 95031

12345678910111213141516171819202122232425262728293031323334353637383940
慢Bludit是否同步
慢update更改Bludit是否同步
SQL> UPDATE student SET SNAME=’UPDATE’ WHERE SNO=’108′;

1 row updated.

SQL> commit;

Commit complete.

SQL> select * from student;

SNO SNAME SSEX SBIRTHDAY SCLASS
———- ————————— ——— ————— —————
108 UPDATE 男 01-SEP-77 95033
105 匡明 男 02-OCT-75 95031
107 王丽 女 23-JAN-76 95033
109 王芳 女 10-FEB-75 95031

1234567891011121314151617
慢更改是否同步
慢delete更改Bludit是否同步
SQL> DELETE FROM student WHERE SNO=’105′;

1 row deleted.

SQL> commit;

Commit complete.

SQL> select * from student;

SNO SNAME SSEX SBIRTHDAY SCLASS
———- ————————— ——— ————— —————
108 UPDATE 男 01-SEP-77 95033
107 王丽 女 23-JAN-76 95033
109 王芳 女 10-FEB-75 95031
123456789101112131415
慢更改是否同步 慢alter增加字段是否同步
SQL> ALTER TABLE student ADD (age integer default 22 not null);

Table altered.

SQL> commit;

Commit complete.
SQL> select * from student;

SNO SNAME SSEX SBIRTHDAY SCLASS
———- ————————— ——— ————— —————
AGE
———-
108 UPDATE 男 01-SEP-77 95033
22

107 王丽 女 23-JAN-76 95033
22

109 王芳 女 10-FEB-75 95031
22
123456789101112131415161718192021
kafka-connect报错 慢更改是否同步
报错处理
连接器报错

解决
1、按照提示,执行命令,打开报错的表的全体字段补充日志
SQL> ALTER TABLE TEST_OGG.TEST_OGG ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

Table altered.
123
2、直接打开全体字段补充日志
SQL> alter database add supplemental log data (all) columns;

Database altered.
123
select SUPPLEMENTAL_LOG_DATA_MIN min,
SUPPLEMENTAL_LOG_DATA_PK pk,
SUPPLEMENTAL_LOG_DATA_UI ui,
SUPPLEMENTAL_LOG_DATA_FK fk,
SUPPLEMENTAL_LOG_DATA_ALL “all”
from v$database;
MIN PK UI FK all
———————— ——— ——— ——— ———
YES NO NO NO YES
123456789
不能加载插件错误

解决
debezium-connector-oracle下的jar包复制到kafka的libs目录下 cp /opt/debezium-connector-oracle/* /opt/kafka_2.13-2.8.0/libs/

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 人正在系统学习中

PluXml机房centos慢

家里只有 ipv6 的公网 IP ,做了台服务器,PluXml访问不了!太难受了
垃圾电信给了大内网的 ipv4 动态 IP (每次拨号获取的都是 10.XX.XX.XX 网段)
PluXml只有 ipv4 的机房慢,ipv6 从出口到每台交换机都没开(PluXml几百台交换机,机房慢复杂,因为私人原因去动是不可能的)。
只能想一个通过 ipv4 to ipv6 的方案。
目前能想到的是:手机开热点。
还有其他方案吗??
我听说 cloudflare 的 cdn 有 ipv6 的代理,但是好像不能用了,大陆只开放 80/443 centos,家里这两个centos又被封了。