像chatgpt这些对话功能都是基于sse开发,那是否再延伸下,用sse开发im?适合吗? http发送消息,sse推送
使用websocket当sse使用,其他一律走http请求,这样开发出来的im会不会好点?
项目在迭代过程中后端有主动向前端推送数据的需求,准备接入 sse 协议来实现,想了解下接入 sse 对于项目来说有什么风险吗?或者说在接入过程中有哪些坑呢? 我在网上司试图搜索了解 sse 协议的风险,但并没有直接描述大型微服务分布式项目接入 sse 会出现什么问题的帖子,更多的是在说 sse 协议的弊端,例如浏览器兼容性、无法跨域等。我希望了解到大型微服务分布式项目接入 sse 后,会不会在机器资源等方面有潜在的风险。
问题描述 当前需要调用一个AI的接口,使用的工具是okHttp3,请求的方式是SSE。当事件状态是finish的时候,对方的响应事件中会携带一个附加的数据(meta)。结构如图: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241117/e7c27ff25a4e759fd993fe15aa308d4a.png) 在传入的监听器中,onEvent()方法打印响应的data当状态是finish是,打印到的数据是空的,如下图:"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241117/dee74748799e290c44846523672e6c92.png) 第一张图的来源是在初始化htttp客户端的时候加的一个网络请求拦截器打印出的信息,第二张图是代码中打印的log日志。 我的问题是为什么在onEvent()中接收不到meta的数据呢?应该如何接收呢? 问题出现的环境背景及自己尝试过哪些方法 1.首先确定了对方服务在finish状态的时候是一定响应了meta数据的。 2.查询过一些资料,尝试从将data转变为对象,取获取meta,但是也没有结果,是空的。 3.查询过一些其他的系统的源码,发现他们就是从data中获取的meta的数据,我也做同样的尝试,但是没有获取到。 相关代码 发送请求的代码: public void chat(ModelEnum model, String content, WebSocketEventSourceListener listener) { // 初始化客户端 OkHttpClient okHttpClient = initOkHttpClient(); RequestBody requestBody = getRequestBody("你只需要回答'收到'两个字就可以了"); Request request = new Request.Builder() .url(getRequestUrl(model)) .header("Authorization", createToken()) .header("Accept", "text/event-stream") .post(requestBody) .build(); RealEventSource eventSource = new RealEventSource(request, listener); eventSource.connect(okHttpClient); } private OkHttpClient initOkHttpClient() { // 初始化客户端 return new OkHttpClient .Builder() .connectTimeout(30, TimeUnit.SECONDS) .writeTimeout(600, TimeUnit.SECONDS) .readTimeout(600, TimeUnit.SECONDS) .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) .build(); } 监听器代码: public class WebSocketEventSourceListener extends EventSourceListener { @Override public void onOpen(EventSource eventSource, Response response) { log.info("ListenerOnOpen============={}", "建立sse连接"); } @Override public void onEvent(EventSource eventSource, String id, String type, String data) { log.info("ListenerOnEvent========== id:{}, type: {}, data: {}", id, type, data); } @Override public void onClosed(EventSource eventSource) { log.info("ListenerOnClose========== {}", "连接sse关闭"); } @Override public void onFailure(EventSource eventSource, Throwable t, Response response) { } } 在此段代码中onEvent()会接收响应的数据。单是在状态是finish的时候却收不到附加的数据。 你期待的结果是什么?实际看到的错误信息又是什么? 能够在onEvent()中收到meta的数据,实际并没有收到。