什么场景使用了mq?直接掉接口不行吗?

本文探讨了MQ(消息队列)在微服务架构中的关键作用,包括解耦服务间依赖,实现异步处理提升用户体验,以及在高并发场景下削峰填谷,减轻服务器压力。MQ的应用有效促进了系统的稳定性和响应速度。

主要是:解耦、异步、削峰。
(1) 解耦: 例如,生产系统A系统发送数据到B,C,D三个系统中,通过调用接口发送。如果E系统也需要这个消息呢?那如果C系统不需要这个消息了呢?A系统与其他的系统产生严重的耦合。如果使用MQ,A系统产生一条数据,发送到MQ中,哪个系统需要数据自己到MQ里面去消费。如果新系统需要数据直接从MQ里面消费即可;当某个系统不需要这条数据了,就取消读数据的消费即可。这样下来的话A系统压根不需要考虑要给谁发送数据,不需要维护这个代码,也不需要考虑其他系统是否调用成功,失败超时等情况。所以也不需要 直接同步调用接口的,因为MQ直接将它给异步解耦了。

没有使用MQ:
在这里插入图片描述
使用MQ之后:

在这里插入图片描述

(2)异步:A系统接收到一个请求,需要在自己的本地写库,还需要在B,C,D三个系统中写库,B,C,D三个系统写库完毕返回给用户。最终的请求总延时是A+B+C+D的时间,时间过长,导致用户体验不好。如果使用MQ,那么A系统直接发送3条消息到MQ消息队列中,那么A系统返回给用户的数据是A+MQ消耗2的时间,其他系统需要消费到MQ中进行再将数据写入到本地的库中。大大提升了用户的体验。

我们先看一下同步请求的弊端如下图所示
在这里插入图片描述
下面我们看一下使用MQ之后的示例图:
在这里插入图片描述
(3)削峰:减少高峰期对服务器的冲击压力。
在这里插入图片描述

java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束 是一个常见的SQL语法错误,通常发生在使用JDBC连接Oracle数据库时。这个错误的具体含义是SQL语句的语法不正确,导致命令无法正常结束。以下是一些可能的原因和解决方法: ### 可能的原因 1. **SQL语句末尾有多余的分号**:在JDBC中执行SQL语句时,语句末尾不需要加分号。 2. **使用了不支持的SQL语法**:某些SQL语法在JDBC中可能不被支持。 3. **SQL语句中存在拼写错误或语法错误**。 4. **使用了不正确的占位符**:在预编译语句(PreparedStatement)中使用了不正确的占位符。 ### 解决方法 1. **检查SQL语句末尾是否有多余的分号**: ```java String sql = "SELECT * FROM users"; // 正确 // String sql = "SELECT * FROM users;"; // 错误 ``` 2. **确保SQL语法正确**: ```java String sql = "SELECT * FROM users WHERE id = ?"; // 正确 ``` 3. **使用预编译语句(PreparedStatement)时,确保占位符使用正确**: ```java String sql = "SELECT * FROM users WHERE id = ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, userId); ResultSet rs = pstmt.executeQuery(); ``` 4. **检查SQL语句中是否有拼写错误或语法错误**。 ### 示例代码 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class OracleJDBCExample { public static void main(String[] args) { String url = "jdbc:oracle:thin:@localhost:1521:xe"; String user = "username"; String password = "password"; String sql = "SELECT * FROM users WHERE id = ?"; try (Connection connection = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = connection.prepareStatement(sql)) { pstmt.setInt(1, 1); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { System.out.println("ID: " + rs.getInt("id")); System.out.println("Name: " + rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); } } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值