科技新闻

JDK 伪异步编程(线程池)

喜欢而已 提交于 2020-03-07 08:44:14
伪异步IO编程 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接。在高性能服务器应用领域,往往需要面向成千上万个客户端的并发连接,这种模型显然无法满足高性能、高并发接入的场景。为了改进一线程一连接模型,后来又演进出了一种通过线程池或者消息队列实现1个或者多个线程处理N个客户端的模型,由于它的底层通信机制依然使用同步阻塞I/O,所以被称为“伪异步”。 为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远远大于N,通过线程池可以灵活的调配线程资源,设置线程的最大值,防止由于海量并发接入导致线程耗尽。 当有新的客户端接入的时候,将客户端的Socket封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK的线程池维护一个消息队列和N个活跃线程对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。 服务端示例: import java.io.IOException; import java.net

RabbitMQ介绍及安装部署

半城伤御伤魂 提交于 2020-03-07 07:46:08
本节内容: RabbitMQ介绍 RabbitMQ运行原理 RabbitMQ重要术语 三种ExchangeType RabbitMQ集群种类 集群基本概念 镜像模式部署集群 一、RabbitMQ介绍 消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶。 或许你正在考虑进行数据投递,非阻塞操作或推送通知。或许你想要实现发布/订阅,异步处理,或者工作队列。所有这些都属于消息系统的模式。 RabbitMQ是一个消息代理,一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息再传输过程中的安全。 RabbitMQ是一个在AMQP协议标准上完整的、可复用的企业消息系统。它遵循Mozilla Public License开源协议,采用Erlang语言实现的工业级的消息队列。 二、RabbitMQ运行原理 RabbitMQ的两大核心组件是Exchange和Queue,以下是它的运行原理图: 三、RabbitMQ重要术语 Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程。 Vitual Host: 这是一个虚拟概念,类似于权限控制组,一个Vitual Host里面可以有若干个Exchange和Queue,但是权限控制的最小粒度是Vitual Host。 Exchange: 接收生产者发送的消息

Kafka的特点及使用场景

五迷三道 提交于 2020-03-07 07:31:25
Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。 在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转。传统的企业消息系统并不是 非常适合大规模的数据处理。为了已在同时搞定在线应用(消息)和离线应用(数据文件,日志)Kafka就出现了。Kafka可以起到两个作用: 降低系统组网复杂度。 降低编程复杂度,各个子系统不在是相互协商接口,各个子系统类似插口插在插座上,Kafka承担高速数据总线的作用。 Kafka主要特点: 1同时为发布和订阅提供高吞吐量。据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)。 2可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。通过将数据持久化到硬盘以及replication防止数据丢失。 3分布式系统,易于向外扩展。所有的producer、broker和consumer都会有多个,均为分布式的。无需停机即可扩展机器。 4消息被处理的状态是在consumer端维护,而不是由server端维护。当失败时能自动平衡。 5支持online和offline的场景。

进程和线程 的随笔和简述

坚强是说给别人听的谎言 提交于 2020-03-07 06:49:45
虚拟内存技术 每个进程看到自己独占一部分空间,但其实所有进程是共享一个物理内存,进程创建的时候,内核为建立了虚拟内存的布局,初始化进程控制表中相关的链表,但没有立刻拷贝对应数据和代码到当前位置,就是在进程运行时要分配动态内存时,分配虚拟内存,只有访问此数据时,发生缺页异常,才会立刻拷贝数据。 好处: 扩大地址空间 公平内存空间 内存保护:各自进程有各自独立的虚拟内存地址空间,虚存会对特定的地址提供写保护 通信时,可用虚拟共享 节省空间,不同进程使用相同代码时,可以映射同一个代码,不需要拷贝多个 适合多道程序设计 需要连续空间时,实际物理内存空间可以不连续 代价: 需要建立多个数据结构 地址转换要耗时 页面切换需要磁盘io 数据少时比较浪费内存 进程 所有等待态的当条件满足立刻进入就绪态 PCB -》数据结构 进程控制块 存进程的状态放入队 用数组管理所有的pcb 就绪 运行 堵塞 等待io/事件 程序控制cpu,整个系统下一个执行什么完全由cpu控制 操作系统通过时钟中断,控制不让程序继续运行 进入等待态系统程序需要系统调用 软硬件协同设计 内核启动shell在启动其他的线条 双击图表告诉资源管理器就是shell windows 父进程子进程毫无瓜葛 消息传递 堵塞系统调用 非阻塞系统调用 每个进程都有自己的独立地址空间都是从0开始的都是虚拟地址 待更新--------------

KClient——kafka消息中间件源码解读

核能气质少年 提交于 2020-03-07 06:40:13
目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.KClientController top.ninwoo.kclient.app.handler.AnimalsHandler top.ninwoo.kclient.app.domain 总结 kclient-core top.ninwoo.kafka.kclient.boot.KClientBoot createObjectHandler createObjectsHandler createDocumentHandler createBeanHandler createBeansHandler invokeHandler 生产者和消费者创建方法 小结 top.ninwoo.kafka.kclient.boot.KafkaHandlerMeta top.ninwoo.kafka.kclient.core.KafkaProducer top.ninwoo.kafka.kclient.core.KafkaConsumer init() initAsyncThreadPool() initKafka startup() AbstractMessageTask

RabbitMQ学习(2)(工作队列)

五迷三道 提交于 2020-03-07 06:09:48
工作队列 在第 一个教程中, 我们编写了用于从命名队列发送和接收消息的程序。 在这一个中,我们将创建一个 工作队列 ,用于在多个工作人员之间分配耗时的任务。 工作队列(又名: 任务队列 ) 背后的主要思想 是避免立即执行资源密集型任务,必须等待完成。 相反,我们安排稍后完成任务。 我们把一个 任务 封装 成一个消息并发送给一个队列。 在后台运行的工作进程将弹出任务并最终执行作业。 当你运行许多工人时,任务将在他们之间共享。 这个概念在Web应用程序中特别有用,在短的HTTP请求窗口中不可能处理复杂的任务。 默认情况下,RabbitMQ将按顺序将每条消息发送给下一个使用者。 平均而言,每个消费者将获得相同数量的消息。 这种分发消息的方式称为循环法(round-robin)。 试试三个或更多的工人。 消息确认 做任务可能需要几秒钟的时间。 你可能会想知道如果其中一个消费者开始一个长期的任务,并且只是部分完成而死亡会发生什么。 使用我们当前的代码,一旦RabbitMQ向客户发送消息,立即将其标记为删除。 在这种情况下,如果你杀了一个工人,我们将失去刚刚处理的信息。 我们也将失去所有派发给这个特定工作人员但尚未处理的消息。 但我们不想失去任何任务。 如果一名工人死亡,我们希望将任务交付给另一名工人。 为了确保消息永不丢失,RabbitMQ支持 消息 确认 。 消费者发回确认(告知

进程间通信(管道、共享内存、消息队列、信号量)

随声附和 提交于 2020-03-07 04:59:20
进程间通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间考到内核缓存区,进程2再内核缓存区把数据读走,内核提供这种机制称为进程间通信。通信方式有:管道、共享内存、消息对列、信号量等 管道 什么是管道呢? 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”, 管道的本质是内核中的一块缓冲区。 管道的特性 ① 半双工通信 :半双工通信(Half-duplex Communication)可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。在这种工作方式下,发送端可以转变为接收端;相应地,接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种切换方向的单工通信。 ②: 管道的生命周期随进程 ,进程关闭,对应的管道端口关闭,两个进程都关闭,则管道关闭。 ③: 管道自带同步与互斥 :管道为空时读取,read 阻塞;管道满时写入,write 阻塞。 ④: 管道提供字节流传输服务 管道的分类 ①:匿名管道 ②:命名管道 匿名管道 什么是匿名管道? 匿名管道之所以可以通信的本质在于,父进程frok子进程,父子进程各自拥有一个文件描述符表

Django进阶 messages框架

无人久伴 提交于 2020-03-07 04:38:23
在 web 应用程序中,通常需要在处理表单或其他类型的用户输入之后,向用户显示一个通知消息(也称为 flash message)。对于这个功能,Django 提供基于 Cookie 和会话的消息,无论是匿名用户还是认证的用户。 消息框架允许临时将消息存储在请求中,并在下一个请求中提取它们并显示。 每个消息都带有一个特定 level 标签,表示其优先级。 启用消息框架 消息框架的实现通过一个中间件类和对应的上下文处理器。django-admin startproject 命令 创建的默认 settings.py 已经包含启用消息框架功能需要的所有的设置: INSTALLED_APPS django.contrib.messages MIDDLEWARE django.contrib.sessions.middleware.SessionMiddleware django.contrib.messages.middleware.MessageMiddleware 默认的后端存储依赖 sessions。 所以中间件中必须启用 SessionMiddleware 并出现在 MessageMiddleware 之前。 TEMPLATES context_processors 选项包含 django.contrib.messages.context_processors.messages

设置光标位置

為{幸葍}努か 提交于 2020-03-07 04:35:38
今天学习的时候发现SetWindowText设置编辑框的文本后光标位置不变,还是在开头,没到结尾,下面说个改变光标位置的方法 SetWindowText后,用GetWindowTextLength或发送WM_GETTEXTLENGTH消息获取文本的长度(或先获得文本,然后再量长度),然后发送EM_SETSEL或EM_EXSETSEL消息,将wParam和lParam参数(EM_SETSEL而言,EM_EXSETSEL的wParam参数为0,lParam参数是一个CHARRANGE结构)设置为相同的,即选择区域为0,光标就到了设置的位置 来源: https://www.cnblogs.com/Acg-Check/p/4268163.html

HTTP协议基础

☆樱花仙子☆ 提交于 2020-03-07 04:15:25
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。 通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。 通用头域 通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。 Cache