当前位置:首页 > 数码 > 深入解析其原理与应用-大模型平台都在用的SSE协议 (深入的解析)

深入解析其原理与应用-大模型平台都在用的SSE协议 (深入的解析)

admin5个月前 (04-15)数码16

什么是SSE?

SSE(Server-Sent Events)是一种轻量级的服务器端推送技术,允许服务器实时向客户端发送数据。

SSE使用HTTP长轮询机制来实现实时通信。服务器发送一个包含名为“EventSource”的`Content-Type`标头的响应,随后不断向客户端发送数据,直到连接关闭。

SSE的优点包括:

  • 简单易用,不需要客户端库
  • 浏览器支持广泛
  • 数据可以按需发送,减少网络开销

SSE的缺点包括:

  • 连接依赖于HTTP长轮询,可能会出现延迟和网络开销
  • 不支持双向通信,只能从服务器到客户端发送数据

WebSocket

WebSocket是一种双向通信协议,允许在服务器和客户端之间建立持久连接。

WebSocket通过使用WebSockets API建立基于TCP的连接,从而实现实时通信。

WebSocket的优点包括:

  • 双向通信
  • 持久连接,减少网络开销
  • 低延迟,更适合实时应用程序

WebSocket的缺点包括:

深入的解析
  • 需要客户端库来支持
  • 浏览器支持可能有限
  • 需要服务器端支持

SSE与WebSocket的比较

SSE和WebSocket都是实时通信技术的有效选择。以下是它们之间的主要区别:

特性 SSE WebSocket
协议类型 服务器端推送 双向通信
实现方式 HTTP长轮询 TCP连接
浏览器支持 广泛支持 有限支持
延迟 较高 较低
双向通信
网络开销 可能较高 较低
客户端库 不需要 需要

在大型模型平台中的SSE使用

SSE在大型模型平台中具有广泛的应用场景,例如:

  • 实时监控模型训练进度
  • 接收模型预测结果
  • 流式传输模型输出

以下是用Python和React实现SSE的代码示例:

Python服务器端


import asyncio
import tornado.web
import tornado.websocket

class SSEHandler(tornado.web.RequestHandler):

    def initialize(self, events):
        self.events = events

    def get(self):
        self.set_header("Content-Type", "text/event-stream")
        self.set_header("Cache-Control", "no-cache")

        for event in self.events:
            self.write("data: {}\n\n".format(event))

    def post(self):
        data = self.get_argument("data")
        self.events.append(data)
        self.write("data: {}\n\n".format(data))

class MainHandler(tornado.websocket.WebSocketHandler):

    def open(self):
        print("WebSocket opened")

    def on_message(self, message):
        print("Received message: {}".format(message))

    def on_close(self):
        print("WebSocket closed")

def make_app():
    events = []
    return tornado.web.Application([
        (r"/sse", SSEHandler, {"events": events}),
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    asyncio.get_event_loop().run_forever()
      

React客户端


import React, { useEffect, useState } from "react";

const App = () => {
  const [messages, setMessages] = useState([]);

  useEffect(() => {
    const eventSource = new EventSource("http://localhost:8888/sse");

    eventSource.onmessage = (event) => {
      setMessages((messages) => [...messages, event.data]);
    };

return () => {
      eventSource.close();
    };
  }, []);

  return (
    
    {messages.map((message) => (
  • {message}
  • ))}
); }; export default App;

总结

SSE和WebSocket都是实现实时通信的有效协议,但它们有不同的优势和缺点。

SSE适用于需要简单、轻量级解决方案的情况,而WebSocket适用于需要低延迟、双向通信的更复杂应用。

在大型模型平台中,SSE可以用来流式传输模型输出、监控训练进度和接收预测结果。


详解路由器原理及路由协议

路由器使用很广泛,不少人不太了解路由器相关知识,我为大家介绍路由器相关知识。 对学习终身受益。 路由器是一种连线多个网路或网段的网路装置,它能将不同网路或网段之间的资料资讯进行“翻译”,以使它们能够相互“读”懂对方的资料,从而构成一个更大的网路。 路由器有两大典型功能,即资料通道功能和控制功能。 资料通道功能包括转发决定、背板转发以及输出链路排程等,一般由特定的硬体来完成;控制功能一般用软体来实现,包括与相邻路由器之间的资讯交换、系统配置、系统管理等。 多少年来,路由器的发展有起有伏。 90年代中期,传统路由器成为制约因特网发展的瓶颈。 ATM交换机取而代之,成为IP骨干网的核心,路由器变成了配角。 进入90年代末期,Internet规模进一步扩大,流量每半年翻一番,ATM网又成为瓶颈,路由器东山再起,Gbps路由交换机在1997年面世后,人们又开始以Gbps路由交换机取代ATM交换机,架构以路由器为核心的骨干网。 路由器原理及路由协议 1 网路互连 把自己的网路同其它的网路互连起来,从网路中获取更多的资讯和向网路释出自己的讯息,是网路互连的最主要的动力。 网路的互连有多种方式,其中使用最多的是网桥互连和路由器互连。 1.1 网桥互连的网路 网桥工作在OSI模型中的第二层,即链路层。 完成资料帧frame的转发,主要目的是在连线的网路间提供透明的通讯。 网桥的转发是依据资料帧中的源地址和目的地址来判断一个帧是否应转发和转发到哪个埠。 帧中的地址称为“MAC”地址或“硬体”地址,一般就是网络卡所带的地址。 网桥的作用是把两个或多个网路互连起来,提供透明的通讯。 网路上的装置看不到网桥的存在,装置之间的通讯就如同在一个网上一样方便。 由于网桥是在资料帧上进行转发的,因此只能连线相同或相似的网路相同或相似结构的资料帧,如乙太网之间、乙太网与令牌环token ring之间的互连,对于不同型别的网路资料帧结构不同,如乙太网与X.25之间,网桥就无能为力了。 网桥扩大了网路的规模,提高了网路的效能,给网路应用带来了方便,在以前的网路中,网桥的应用较为广泛。 但网桥互连也带来了不少问题:一个是广播风暴,网桥不阻挡网路中广播讯息,当网路的规模较大时几个网桥,多个乙太网段,有可能引起广播风暴broadcasting storm,导致整个网路全被广播资讯充满,直至完全瘫痪。 第二个问题是,当与外部网路互连时,网桥会把内部和外部网络合二为一,成为一个网,双方都自动向对方完全开放自己的网路资源。 这种互连方式在与外部网路互连时显然是难以接受的。 问题的主要根源是网桥只是最大限度地把网路沟通,而不管传送的资讯是什么。 1.2 路由器互连网路 路由器互连与网路的协议有关,我们讨论限于TCP/IP网路的情况。 路由器工作在OSI模型中的第三层,即网路层。 路由器利用网路层定义的“逻辑”上的网路地即IP地址来区别不同的网路,实现网路的互连和隔离,保持各个网路的独立性。 路由器不转发广播讯息,而把广播讯息限制在各自的网路内部。 传送到其他网路的资料茵先被送到路由器,再由路由器转发出去。 IP路由器只转发IP分组,把其余的部分挡在网内包括广播,从而保持各个网路具有相对的独立性,这样可以组成具有许多网路子网互连的大型的网路。 由于是在网路层的互连,路由器可方便地连线不同型别的网路,只要网路层执行的是IP协议,通过路由器就可互连起来。 网路中的装置用它们的网路地址TCP/IP网路中为IP地址互相通讯。 IP地址是与硬体地址无关的“逻辑”地址。 路由器只根据IP地址来转发资料。 IP地址的结构有两部分,一部分定义网路号,另一部分定义网路内的主机号。 目前,在Internet网路中采用子网掩码来确定IP地址中网路地址和主机地址。 子网掩码与IP地址一样也是32bit,并且两者是一一对应的,并规定,子网掩码中数字为“1”所对应的IP地址中的部分为网路号,为“0”所对应的则为主机号。 网路号和主机号合起来,才构成一个完整的IP地址。 同一个网路中的主机IP地址,其网路号必须是相同的,这个网路称为IP子网。 通讯只能在具有相同网路号的IP地址之间进行,要与其它IP子网的主机进行通讯,则必须经过同一网路上的某个路由器或闸道器gateway出去。 不同网路号的IP地址不能直接通讯,即使它们接在一起,也不能通讯。 路由器有多个埠,用于连线多个IP子网。 每个埠的IP地址的网路号要求与所连线的IP子网的网路号相同。 不同的埠为不同的网路号,对应不同的IP子网,这样才能使各子网中的主机通过自己子网的IP地址把要求出去的IP分组送到路由器上。 2 路由原理 当IP子网中的一台主机发送IP分组给同一IP子网的另一台主机时,它将直接把IP分组送到网路上,对方就能收到。 而要送给不同IP于网上的主机时,它要选择一个能到达目的子网上的路由器,把IP分组送给该路由器,由路由器负责把IP分组送到目的地。 如果没有找到这样的路由器,主机就把IP分组送给一个称为“预设闸道器default gateway”的路由器上。 “预设闸道器”是每台主机上的一个配置引数,它是接在同一个网路上的某个路由器埠的IP地址。 路由器转发IP分组时,只根据IP分组目的IP地址的网路号部分,选择合适的埠,把IP分组送出去。 同主机一样,路由器也要判定埠所接的是否是目的子网,如果是,就直接把分组通过埠送到网路上,否则,也要选择下一个路由器来传送分组。 路由器也有它的预设闸道器,用来传送不知道往哪儿送的IP分组。 这样,通过路由器把知道如何传送的IP分组正确转发出去,不知道的IP分组送给“预设闸道器”路由器,这样一级级地传送,IP分组最终将送到目的地,送不到目的地的IP分组则被网路丢弃了。 ——目前TCP/IP网路,全部是通过路由器互连起来的,Internet就是成千上万个IP子网通过路由器互连起来的国际性网路。 这种网路称为以路由器为基础的网路router based network,形成了以路由器为节点的“网间网”。 在“网间网”中,路由器不仅负责对IP分组的转发,还要负责与别的路由器进行联络,共同确定“网间网”的路由选择和维护路由表。 ——路由动作包括两项基本内容:寻径和转发。 寻径即判定到达目的地的最佳路径,由路由选择演算法来实现。 由于涉及到不同的路由选择协议和路由选择演算法,要相对复杂一些。 为了判定最佳路径,路由选择演算法必须启动并维护包含路由资讯的路由表,其中路由资讯依赖于所用的路由选择演算法而不尽相同。 路由选择演算法将收集到的不同资讯填入路由表中,根据路由表可将目的网路与下一站nexthop的关系告诉路由器。 路由器间互通讯息进行路由更新,更新维护路由表使之正确反映网路的拓扑变化,并由路由器根据量度来决定最佳路径。 这就是路由选择协议routing protocol,例如路由资讯协议RIP、开放式最短路径优先协议OSPF和边界闸道器协议BGP等。 ——转发即沿寻径好的最佳路径传送资讯分组。 路由器首先在路由表中查询,判明是否知道如何将分组传送到下一个站点路由器或主机,如果路由器不知道如何传送分组,通常将该分组丢弃;否则就根据路由表的相应表项将分组传送到下一个站点,如果目的网路直接与路由器相连,路由器就把分组直接送到相应的埠上。 这就是路由转发协议routed protocol。 ——路由转发协议和路由选择协议是相互配合又相互独立的概念,前者使用后者维护的路由表,同时后者要利用前者提供的功能来发布路由协议资料分组。 下文中提到的路由协议,除非特别说明,都是指路由选择协议,这也是普遍的习惯。 3。 路由协议 ——典型的路由选择方式有两种:静态路由和动态路由。 ——静态路由是在路由器中设定的固定的路由表。 除非网路管理员干预,否则静态路由不会发生变化。 由于静态路由不能对网路的改变作出反映,一般用于网路规模不大、拓扑结构固定的网路中。 静态路由的优点是简单、高效、可靠。 在所有的路由中,静态路由优先顺序最高。 当动态路由与静态路由发生冲突时,以静态路由为准。 ——动态路由是网路中的路由器之间相互通讯,传递路由资讯,利用收到的路由资讯更新路由器表的过程。 它能实时地适应网路结构的变化。 如果路由更新资讯表明发生了网路变化,路由选择软体就会重新计算路由,并发出新的路由更新资讯。 这些资讯通过各个网路,引起各路由器重新启动其路由演算法,并更新各自的路由表以动态地反映网路拓扑变化。 动态路由适用于网路规模大、网路拓扑复杂的网路。 当然,各种动态路由协议会不同程度地占用网路频宽和CPU资源。 ——静态路由和动态路由有各自的特点和适用范围,因此在网路中动态路由通常作为静态路由的补充。 当一个分组在路由器中进行寻径时,路由器首先查询静态路由,如果查到则根据相应的静态路由转发分组;否则再查询动态路由。 ——根据是否在一个自治域内部使用,动态路由协议分为内部闸道器协议IGP和外部闸道器协议EGP。 这里的自治域指一个具有统一管理机构、统一路由策略的网路。 自治域内部采用的路由选择协议称为内部闸道器协议,常用的有RIP、OSPF;外部闸道器协议主要用于多个自治域之间的路由选择,常用的是BGP和BGP-4。 下面分别进行简要介绍。 3.1 RIP路由协议 ——RIP协议最初是为Xerox网路系统的Xerox parc通用协议而设计的,是Internet中常用的路由协议。 RIP采用距离向量演算法,即路由器根据距离选择路由,所以也称为距离向量协议。 路由器收集所有可到达目的地的不同路径,并且储存有关到达每个目的地的最少站点数的路径资讯,除到达目的地的最佳路径外,任何其它资讯均予以丢弃。 同时路由器也把所收集的路由资讯用RIP协议通知相邻的其它路由器。 这样,正确的路由资讯逐渐扩散到了全网。 ——RIP使用非常广泛,它简单、可靠,便于配置。 但是RIP只适用于小型的同构网路,因为它允许的最大站点数为15,任何超过15个站点的目的地均被标记为不可达。 而且RIP每隔30s一次的路由资讯广播也是造成网路的广播风暴的重要原因之一。 3.2 OSPF路由协议 ——80年代中期,RIP已不能适应大规模异构网路的互连,0SPF随之产生。 它是网间工程任务组织1ETF的内部闸道器协议工作组为IP网路而开发的一种路由协议。 ——0SPF是一种基于链路状态的路由协议,需要每个路由器向其同一管理域的所有其它路由器传送链路状态广播资讯。 在OSPF的链路状态广播中包括所有介面资讯、所有的量度和其它一些变数。 利用0SPF的路由器首先必须收集有关的链路状态资讯,并根据一定的演算法计算出到每个节点的最短路径。 而基于距离向量的路由协议仅向其邻接路由器传送有关路由更新资讯。 ——与RIP不同,OSPF将一个自治域再划分为区,相应地即有两种型别的路由选择方式:当源和目的地在同一区时,采用区内路由选择;当源和目的地在不同区时,则采用区间路由选择。 这就大大减少了网路开销,并增加了网路的稳定性。 当一个区内的路由器出了故障时并不影响自治域内其它区路由器的正常工作,这也给网路的管理、维护带来方便。 3.3 BGP和BGP-4路由协议 ——BGP是为TCP/IP网际网路设计的外部闸道器协议,用于多个自治域之间。 它既不是基于纯粹的链路状态演算法,也不是基于纯粹的距离向量演算法。 它的主要功能是与其它自治域的BGP交换网路可达资讯。 各个自治域可以执行不同的内部闸道器协议。 BGP更新资讯包括网路号/自治域路径的成对资讯。 自治域路径包括到达某个特定网路须经过的自治域串,这些更新资讯通过TCP传送出去,以保证传输的可靠性。 ——为了满足Internet日益扩大的需要,BGP还在不断地发展。 在最新的BGp4中,还可以将相似路由合并为一条路由。 3.4 路由表项的优先问题 ——在一个路由器中,可同时配置静态路由和一种或多种动态路由。 它们各自维护的路由表都提供给转发程式,但这些路由表的表项间可能会发生冲突。 这种冲突可通过配置各路由表的优先顺序来解决。 通常静态路由具有预设的最高优先顺序,当其它路由表表项与它矛盾时,均按静态路由转发。 4 路由演算法 ——路由演算法在路由协议中起著至关重要的作用,采用何种演算法往往决定了最终的寻径结果,因此选择路由演算法一定要仔细。 通常需要综合考虑以下几个设计目标: ——1最优化:指路由演算法选择最佳路径的能力。 ——2简洁性:演算法设计简洁,利用最少的软体和开销,提供最有效的功能。 ——3坚固性:路由演算法处于非正常或不可预料的环境时,如硬体故障、负载过高或操作失误时,都能正确执行。 由于路由器分布在网路联接点上,所以在它们出故障时会产生严重后果。 最好的路由器演算法通常能经受时间的考验,并在各种网路环境下被证实是可靠的。 ——4快速收敛:收敛是在最佳路径的判断上所有路由器达到一致的过程。 当某个网路事件引起路由可用或不可用时,路由器就发出更新资讯。 路由更新资讯遍及整个网路,引发重新计算最佳路径,最终达到所有路由器一致公认的最佳路径。 收敛慢的路由演算法会造成路径回圈或网路中断。 ——5灵活性:路由演算法可以快速、准确地适应各种网路环境。 例如,某个网段发生故障,路由演算法要能很快发现故障,并为使用该网段的所有路由选择另一条最佳路径。 ——路由演算法按照种类可分为以下几种:静态和动态、单路和多路、平等和分级、源路由和透明路由、域内和域间、链路状态和距离向量。 前面几种的特点与字面意思基本一致,下面着重介绍链路状态和距离向量演算法。 ——链路状态演算法也称最短路径演算法传送路由资讯到网际网路上所有的结点,然而对于每个路由器,仅传送它的路由表中描述了其自身链路状态的那一部分。 距离向量演算法也称为Bellman-Ford演算法则要求每个路由器传送其路由表全部或部分资讯,但仅传送到邻近结点上。 从本质上来说,链路状态演算法将少量更新资讯传送至网路各处,而距离向量演算法传送大量更新资讯至邻接路由器。 ——由于链路状态演算法收敛更快,因此它在一定程度上比距离向量演算法更不易产生路由回圈。 但另一方面,链路状态演算法要求比距离向量演算法有更强的CPU能力和更多的记忆体空间,因此链路状态演算法将会在实现时显得更昂贵一些。 除了这些区别,两种演算法在大多数环境下都能很好地执行。 ——最后需要指出的是,路由演算法使用了许多种不同的度量标准去决定最佳路径。 复杂的路由演算法可能采用多种度量来选择路由,通过一定的加权运算,将它们合并为单个的复合度量、再填入路由表中,作为寻径的标准。 通常所使用的度量有:路径长度、可靠性、时延、频宽、负载、通讯成本等。 5 新一代路由器 ——由于多媒体等应用在网路中的发展,以及ATM、快速乙太网等新技术的不断采用,网路的频宽与速率飞速提高,传统的路由器已不能满足人们对路由器的效能要求。 因为传统路由器的分组转发的设计与实现均基于软体,在转发过程中对分组的处理要经过许多环节,转发过程复杂,使得分组转发的速率较慢。 另外,由于路由器是网路互连的关键装置,是网路与其它网路进行通讯的一个“关口”,对其安全性有很高的要求,因此路由器中各种附加的安全措施增加了CPU的负担,这样就使得路由器成为整个网际网路上的“瓶颈”。 ——传统的路由器在转发每一个分组时,都要进行一系列的复杂操作,包括路由查询、访问控制表匹配、地址解析、优先顺序管理以及其它的附加操作。 这一系列的操作大大影响了路由器的效能与效率,降低了分组转发速率和转发的吞吐量,增加了CPU的负担。 而经过路由器的前后分组间的相关性很大,具有相同目的地址和源地址的分组往往连续到达,这为分组的快速转发提供了实现的可能与依据。 新一代路由器,如IP Switch、Tag Switch等,就是采用这一设计思想用硬体来实现快速转发,大大提高了路由器的效能与效率。 ——新一代路由器使用转发快取来简化分组的转发操作。 在快速转发过程中,只需对一组具有相同目的地址和源地址的分组的前几个分组进行传统的路由转发处理,并把成功转发的分组的目的地址、源地址和下一闸道器地址下一路由器地址放人转发快取中。 当其后的分组要进行转发时,茵先检视转发快取,如果该分组的目的地址和源地址与转发快取中的匹配,则直接根据转发快取中的下一闸道器地址进行转发,而无须经过传统的复杂操作,大大减轻了路由器的负担,达到了提高路由器吞吐量的目标。

区块链是什么 深入解析区块链技术原理与应用?

区块链是一种分布式、去中心化的技术和数据结构,它可以用于安全地记录和管理交易、信息或任何类型的数据。区块链的核心思想是将数据分散存储在多个节点上,每个节点都有相同的数据副本,通过密码学和共识机制确保数据的安全性、透明性和不可篡改性。以下是对区块链技术原理和应用的深入解析:

区块链技术原理:

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: SSE协议