Lazy loaded image
C++气象项目数据中心实战
Words 6789Read Time 17 min
2022-10-17
Created
Mar 17, 2022 07:32 AM
URL
Tags
notion image

第一章 课程导学和准备工作

  1. 关键是手写代码,测试效果
  1. 掌握应用开发架构和自研架构能力,可复用代码模块开发

1-2 项目介绍

  • 气象行业业务系统多,几百个
  • 气象数据中心是气象行业基础系统,为业务系统提供数据支撑环境
  • 数据种类很多,数据量很庞大,业务系统很复杂
notion image
功能模块
数据采集子系统
  • ftp 协议采集文件
  • http 从 web 服务接口采集
  • 直接连接数据源数据库,从表中抽取数据
数据处理和加工子系统
  • 原始数据转化为 xml 格式数据
  • 对原始数据加工,生成高可用的数据集
数据入库子系统
  • 数百种数据存入数据中心
数据同步子系统
  • mySQL 高可用性方案
  • 核心数据库按条件同步到业务数据库中。
  • 核心数据库中数据增量同步到业务数据库中
表到表 mySQL 做不到
表到表 mySQL 做不到
数据管理子系统
  • 清理历史数句
  • 把历史数句备份归档
数句交换子系统
  • 数据中心表导出,生成数据文件
  • ftp 发送
  • tcp 快速传输
数据服务总线
  • C++开发 WEB 服务,为业务系统提供数据访问接口。
  • 效率极高(数据库连接池和线程池)
网络代理服务
  • 用于运维而开发的工具
  • I/O 复用技术
 
重点和难点
  • 服务程序稳定性
  • 数据处理和数据服务的效率
  • 功能模块的通用性
 
 
 

1-3 开发环境

  • Centos7.x , ssh客户端 SecureCRT vi
  • MySQL5.7 客户端 Navicat Premium
  • gcc g++
  • 字符集 UTF8

1-4 项目语言和开发框架

├── idc [数据中心项目模块]
│   ├── bin [可执行文件]
│   ├── c [c 源代码]
│   ├── ini [参数配置文件]
│   └── sql
├── pthread [Linux 线程 demo程序]
├── public [开发框架]
│   ├── db [数据开发框架,MYSQL,Oracle 数据库]
│   ├── demo
│   ├── ini
│   ├── socket [网络编程 demo 程序]
├── tools [通用功能模块]
│   ├── bin 可执行文件
│   ├── c
│   └── ini 参数配置文件
 
开发框架
  • 开发框架可以简单理解为已封装好的函数和类,是工具的集合;
  • 拥有开发框架,可以提高开发效率
notion image
  • 了解开发框架的功能和使用方法,源码不是重点

第二章 如何保证服务程序永不停机

守护进程监控 → 故障调度重启服务程序
  1. 生成测试数据(生成测试数据,掌握开发框架,cdv.xml.json 格式数据)
  1. 服务程序调度(Linux 信号,linux 多进程,服务程序调度模块)
  1. 守护进程实现(Linux 共享内存,Linux 信号量)
  1. 两个常用小工具(开发压缩文件模块,开发清理历史数据文件模块)

2-2 生成测试数据 - 搭建程序的框架

全国气象站点参数 /project/idc/ini/stcode.ini
全国气象站点分钟观测数据
业务要求:
  • 根据站点参数,模拟生成观测数据
  • 每分钟,839 行,保存文本文件
notion image
 
写程序
调试和编译程序
打开框架头文件
打开框架cpp文件
打开日志文件
 
有漏洞文件存储方法
  1. 打开文件
  1. 往文件中写入数据
  1. 关闭文件
写文件同时读取文件
 
存入文件步骤
  1. 打开临时文件
  1. 往临时文件中写入数据
  1. 关闭临时文件
  1. 把临时文件改名为正式文件

2-3 生成测试数据-加载站点参数

2-7 Linux 信号

  1. 信号基础知识和使用方法(信号最常见用法,检测服务进程是否存活,多进程和多线程服务程序中信号用法)
  1. 多进程基础知识和使用方法
  1. 开发服务程序调度模块
信号(signal)是软件中断,是进程之间相互传递消息的一种方法,用于通知进程发生了事件,但是,不能给进程传递任何数据。 信号产生的原因有很多,在Linux下,可以用kill和killall命令发送信号。
信号名
信号值
默认处理动作
发出信号的原因
SIGHUP
1
A
终端挂起或者控制进程终止
SIGINT
2
A
键盘中断Ctrl+c
SIGQUIT
3
C
键盘的退出键被按下
SIGILL
4
C
非法指令
SIGABRT
6
C
由abort(3)发出的退出指令
SIGFPE
8
C
浮点异常
SIGKILL
9
AEF
采用kill -9 进程编号 强制杀死程序。
SIGSEGV
11
C
无效的内存引用
SIGPIPE
13
A
管道破裂,写一个没有读端口的管道。
SIGALRM
14
A
由alarm(2)发出的信号
SIGTERM
15
A
采用“kill 进程编号”或“killall 程序名”通知程序。
SIGUSR1
10
A
用户自定义信号1
SIGUSR2
12
A
用户自定义信号2
SIGCHLD
17
B
子进程结束信号
SIGCONT
18
进程继续(曾被停止的进程)
SIGSTOP
19
DEF
终止进程
SIGTSTP
20
D
控制终端(tty)上按下停止键
SIGTTIN
21
D
后台进程企图从控制终端读
SIGTTOU
22
D
后台进程企图从控制终端写
处理动作一项中的字母含义如下 A 缺省的动作是终止进程。 B 缺省的动作是忽略此信号,将该信号丢弃,不做处理。 C 缺省的动作是终止进程并进行内核映像转储(core dump),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员 提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。 D 缺省的动作是停止进程,进入停止状态的程序还能重新继续,一般是在调试的过程中。 E 信号不能被捕获。 F 信号不能被忽略。
 
  1. 服务程序运行在后台,如果想让中止它,杀掉不是个好办法,因为程序被杀的时候,程序突然死亡,没有安排善后工作。
  1. 如果向服务程序发送一个信号,服务程序收到这个信号后,调用一个函数,在函数中编写善后的代码,程序就可以有计划的退出。
  1. 向服务程序发送0的信号,可以检测程序是否存活。killall -0 book

2-8 Linux 多进程

 
 
 
 
 
 
 
 
notion image
 

2-9 服务程序的调度

  • 周期性的启动后台服务程序
  • 常驻内存中的服务程序异常终止,在短时间内重启

第三章 开发基于ftp协议的文件传输子系统

3-1 ftp基础知识

  • ftp协议的基本概念
  • 在CentOS7中安装和配置ftp服务
  • 掌握ftp的常用命令
  • 参照《CentOS7安装和配置ftp服务.docx》和 《ftp命令详解.docx》

3-3 ftp客户端的封装

  • 寻找开源的 库,封装成 C++ 的 Cftp 库。
  • 掌握Cftp类的使用方法
 
上传文件和下载文件确认文件完整性的方式不同:
上传文件,根据文件大小,这是因为上传到服务器时间会改变
下载文件,根据文件时间,下载的时间在传输过程没有改变
分析源码

3-4 ftp下载文件 - 搭建程序的框架

3-5 ftp下载文件 - 下载全部文件

测试数据文件
实现:从远端服务器下载到本地服务器功能

3-6 ftp下载文件 - 清理和转存文件

文件下载的需求:
  • 增量下载文件,每次只下载新增的和修改过的文件 (多个客户端,单个服务器端)
  • 下载文件后,删除ftp服务器上文件(单个客户端,单个服务器端)
  • 下载文件后,把ftp服务器上的文件移动到备份目录(单个客户端,单个服务器端)
 
"<ptype>1</ptype> 文件下载成功后,远程服务端文件的处理方式:1-什么也不做;2-删除;3-备份,如果为3,还要指定备份的目录。
 

3-7 ftp下载文件 - 下载新增的文件

  • 增量下载文件,每次只下载新增的和修改过的文件 (多个客户端,单个服务器端)
 

3-8 ftp下载文件 - 下载修改的文件

 
 
哪些程序会挂死?
  • 涉及网络通信、数据库操作的程序很容易挂死
  • 比较复杂的程序可能会挂死
  • 简单的程序基本上不会挂死
调度进程(procctl)、守护进程(checkproc)、压缩、删除、生成
FTP下载程序
 

3-9 ftp上传文件

 

3-10 本章总结

 
 
 

第四章 开发基于tcp协议的文件传输子系统

4-1 开篇语

  1. 基础知识的学习
    1. 计算机网络基础知识
    2. 掌握socket的常用函数,能编写最简单的网络通信程序)
    3. 📌
      写一个简单的Socket函数
  1. 封装socker的API
    1. 解决TCP报文的粘包/分包的问题
    2. 封装socker的常用函数
  1. 多进程的网络服务端
    1. 搭建多进程的网络服务程序框架
    2. TCP短连接/长链接和心跳机制
  1. 基于TCP协议的文件传输系统
    1. 实现文件的上传和下载功能
    2. 采用异步通信机制,实现文件的快速传输

4-2 解决TCP粘包和分包的问题

 

4-3 封装sokcet的常用函数

4-4 搭建多进程网络服务程序框架

4-5 多进程网络服务程序的退出

4-6 网银APP软件业务示例

4-7 TCP长连心跳机制的实现

4-8 TCP文件传输系统-搭建上传程序01

4-9 TCP文件传输系统-搭建上传程序01

4-10 TCP文件传输系统-上传文件的

4-1 开篇语

4-1 开篇语

 

第五章 轻松搞定MySQL数据库的开发

5-1 开篇语

  1. 基础知识的学习
    1. 掌握MySQL数据库级客户端软件的安装、配置和使用
    2. 掌握SQL语言(增、删、改、查)和MySQL的常用函数
    3. 理解MySQL的高可用方案的原理。
    4. ✔️
      命令行和图形界面访问MySQL服务器
      mysql-tutorial
      jaywcjloveUpdated Mar 15, 2025
  1. 封装MySQL的API
    1. 学习connection和sqlstatement类的使用方法;
    2. 在C++程序中操作MySQL数据库(增、删、改、查)
    3. MySQL数据库开发注意事项
    4. ✔️
      connection 和 sqlstatement 类的使用方法
  1. 学习数据库设计工具
    1. 学习PowerDesigner软件的使用方法;
    2. 生成数据库设计文档和SQL语句。
  1. 把测试数据文件入库
    1. 站点参数入库
    2. 观测数据入库
    3. 数据库版本是MySQL 5.7.34 ,字符集utf8

5-2 创建超女信息表

头文件路径 (mysql.h)
库文件路径 (静态库 libmysqlclient.a,动态库 libmysqlclient.so)
添加搜索路径

5-3 往超女信息表中插入数据

5-4 修改超女信息表中的数据

5-5 查询超女信息表中的数据

5-6 删除超女信息表中的数据

5-7 二进制大对象的存取

notion image
类型
大小(单位:字节)
TinyBlob
最大 255
Blob
最大 65 K 或 65535
MediumBlob
最大 16 M 或 16777215
LongBlob
最大 4 G 或 4294967295
  • 二进制大对象占用的磁盘空间很大,对数据库造成压力
  • 不要把大量的二进制大对象存入数据库
  • 把二进制大对象存放在磁盘文件中,把文件名存放在数据库表中

5-8 数据库开发注意事项和技巧

  • 一个 connection 对象同一时间只能连一个数据库(断开可重连)
    • 同一个程序中,创建多个 connection 对象可以同时连接多个数据库
    • 每个 connection 对象的事务是独立的。
      • 多个进程不能共享同一个已连接成功的 connection 对象
      • 多个 sqlstatement 对象可以绑定同一个 connection 对象
      • 如果执行了 select 语句,在结果集没有获取完成之前,同一 connection 中的全部 sqlstatement 对象不能执行任何 SQL 语句
        • C 语言不能表示空的整数和浮点数,实战中可以用字符串存放整数和浮点数,可以表示空值

          5-9 强大的 PowerDesigner

          • 学习PowerDesigner 软件的使用方法;

          5-10 把站点参数文件入库

          MySQL 数据类型

          数值类型

          MySQL 支持所有标准 SQL 数值数据类型。
          这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。
          作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
          类型
          大小
          范围(有符号)
          范围(无符号)
          用途
          TINYINT
          1 Bytes
          (-128,127)
          (0,255)
          小整数值
          SMALLINT
          2 Bytes
          (-32 768,32 767)
          (0,65 535)
          大整数值
          MEDIUMINT
          3 Bytes
          (-8 388 608,8 388 607)
          (0,16 777 215)
          大整数值
          INT或INTEGER
          4 Bytes
          (-2 147 483 648,2 147 483 647)
          (0,4 294 967 295)
          大整数值
          BIGINT
          8 Bytes
          (-9,223,372,036,854,775,808,9 223 372 036 854 775 807)
          (0,18 446 744 073 709 551 615)
          极大整数值
          FLOAT
          4 Bytes
          (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)
          0,(1.175 494 351 E-38,3.402 823 466 E+38)
          单精度浮点数值
          DOUBLE
          8 Bytes
          (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
          0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
          双精度浮点数值
          DECIMAL
          对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2
          依赖于M和D的值
          依赖于M和D的值
          小数值

          日期和时间类型

          表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
          每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
          TIMESTAMP类型有专有的自动更新特性,将在后面描述。
          类型
          大小( bytes)
          范围
          格式
          用途
          DATE
          3
          1000-01-01/9999-12-31
          YYYY-MM-DD
          日期值
          TIME
          3
          '-838:59:59'/'838:59:59'
          HH:MM:SS
          时间值或持续时间
          YEAR
          1
          1901/2155
          YYYY
          年份值
          DATETIME
          8
          1000-01-01 00:00:00/9999-12-31 23:59:59
          YYYY-MM-DD HH:MM:SS
          混合日期和时间值
          TIMESTAMP
          4
          1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07
          YYYYMMDD HHMMSS
          混合日期和时间值,时间戳

          字符串类型

          字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
          类型
          大小
          用途
          CHAR
          0-255 bytes
          定长字符串
          VARCHAR
          0-65535 bytes
          变长字符串
          TINYBLOB
          0-255 bytes
          不超过 255 个字符的二进制字符串
          TINYTEXT
          0-255 bytes
          短文本字符串
          BLOB
          0-65 535 bytes
          二进制形式的长文本数据
          TEXT
          0-65 535 bytes
          长文本数据
          MEDIUMBLOB
          0-16 777 215 bytes
          二进制形式的中等长度文本数据
          MEDIUMTEXT
          0-16 777 215 bytes
          中等长度文本数据
          LONGBLOB
          0-4 294 967 295 bytes
          二进制形式的极大文本数据
          LONGTEXT
          0-4 294 967 295 bytes
          极大文本数据
          注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
          BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
          BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
          有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
           
          notion image
           
           

          5-11 把站点数据文件入库

           

          5-12-1 优化数据入库程序

          5-13-2 优化数据入库程序

          5-14 执行 SQL 脚本文件

          5-15 本章总结

           
           
           
          上一篇
          Data Structure and Algorithm
          下一篇
          用面试拷问嵌入式技术栈

          Comments
          Loading...