于Nginx负载均衡及多线程智慧农业系统的设计
扫描二维码
随时随地手机看文章
引 言
基于底层传感器节点采集信息的智慧农业系统,可以大量获取作物的生长环境参数,在Web 平台上显示时,会有大量用户进行作物实时参数的查询请求,加入Nginx 负载均衡, 能够使 Web 服务器更好的应对高并发的用户访问场景。在系统中,通过 PC 网站发送控制指令,经由 Web 服务器传达到应用服务器,由应用服务器转发给嵌入式服务器。应用服务器由收指令线程和发指令线程组成,通过线程之间的同步和通信可以很好地保障指令发送的正确性,可靠性。
1 Nginx负载均衡
Nginx 是 Igor Sysoev 使用 C 语言为俄罗斯门户网站Rambler.ru 开发的一款Web 服务器。Nginx 以其高性能、稳定、功能丰富、配置简单灵活以及内存消耗低等特点而受到国内外企业的广泛青睐。
当Nginx 服务器启动后,它将产生一个主进程(Master Process),主进程在执行一些业务后,会产生一到多个工作进程(Worker Process)。主进程主要完成 Nginx 配置文件解析、模块配置和注册、数据结构初始化、网络监听生成、工作进程生成和管理以及信号处理 ;工作进程主要包括模块调用、进程初始化以及请求处理,是Nginx 服务器运行过程中提供服务的主要工作部分。Nginx 使用一个主进程来管理多个工作进程,通过内存共享等进程间通信机制实现 Nginx 的负载均衡等功能。Nginx 的结构关系如图 1 所示。
2 Java里的多线程同步机制
在多线程程式中,所有线程都是各自独立的执行体,但线程代码的模式却相同。如果这些线程协同工作,那么其线程代码无法重入控制,因此 Java 提供了相应的同步机制,从而阻止多个线程的一个或多个关键代码在任意时间执行该代码。
该机制建立在锁的概念和监视器基础上,其中监视器是关键代码周围的保护伞,锁则是监视器阻止线程进入监视器的软件。其基本理念是 :如果一个线程要进入监视器所监视的关键代码,该线程需要获取一个与之相关的锁 ;如果别的线程在使用该锁,那么Java 就会强制要求其在一个与锁以及监视器相关的区域等待 ;当锁被释放时,Java 移出等待状态中的线程,同意其获取锁,并对监视器的关键代码进行相应处理。在Java编程过程中经常使用Synchronized 方法和 Synchronized 代码块进行线程的同步。
2.1 Synchronized方法
把 Synchronized 的 关 键 字 加 入 方 法 声 明 中以声 明synchronized()方法。在 synchronized()方法中,类成员变量访问由 synchronized()方法控制,每个类实例都会对应一个锁,如果 synchronized()方法要执行就要获取相应的锁,否则会阻塞所属线程。一旦该方法进入执行状态就会独占一个锁,且直至其返回才会释放。这种机制可以确保在同一时间对于每一个类实例,其声明为Synchronized 的成员函数最多只能有一个处于执行状态,从而避免类成员变量访问产生冲突。Java 中每个类都对应一把这样的锁,因此要控制其访问类的静态成员变量,可把类的静态成员函数声明为Synchronized。
2.2 Synchronized代码块
上述方法中, 如果代码量较多, 则声明的效率会大受影响, 因此我们可以用 Synchronized 块来解决该问题。Synchronized 块中要获取 SynObject 对应的锁才可以执行, 由于可以对任何代码块且上锁的对象任意指定,因此相对Synchronized 块方法有较高的灵活性。
3 多线程同步在系统中的应用
在智慧农业系统中,应用服务器主要负责 Web 服务器发送的指令接收和指令向嵌入式服务器的发送以及上行数据在数据库的存储。应用服务器的模块构成如图 2 所示。
Web 服务器的指令请求发到应用服务器,应用服务器会 通过管理模块起一个进程,并运行主线程来开启指令接收的 线程,同时开启上行数据存储线程来接收嵌入式服务器上传 的监测数据,并存储到 MySQL 数据库中。指令接收线程接收 到指令数据后会启动指令发送线程来向嵌入式服务器发送指 令数据。指令接收线程和指令发送线程之间的协作通过线程 的同步机制 Synchronized 代码块实现。为防止两个不同线程 在访问共享资源时修改其内容,使用了 Java 阻塞机制,notify() 和 wait()方法。wait()使线程进入阻塞状态,notify()解 除阻塞状态的线程。两个方法的配合使用与线程同步共同作 用来保证指令接收线程和指令发送线程的正确协作。
4 农业监测系统实现
在加入 Nginx 负载均衡服务器以及应用服务器多线程后 的系统架构如图 3 所示。
在客户端和 Web 服务器之间加入了负载均衡服务器,让 Web 集群分担来自客户端的请求访问压力,提高系统的响应性 能,增强用户体验。在应用服务器加入多线程可以并发处理多 个指令请求,以提高系统的处理性能。
5 结 语
随着互联网技术的进一步深度发展以及物联网技术的普 及,物联网与传统农业的融合进一步加深,智慧农业是未来 农业发展的必然趋势。当越来越多的农户使用智慧农业系统 时,对系统的性能就提出了更高的要求,该论文设计的系统可 以很好地满足该方面的需求。但随着用户的增加与数据的积 累,对数据进行处理也是必不可少的业务,而这正是该系统欠 缺的部分。但相信随着进一步的设计开发,这个问题一定会得 到完满解决。