银行汇率查询:并发调用与频率控制(纯同步模型,无回调/无订阅)
# 银行汇率查询:并发调用与频率控制(纯同步模型,无回调/无订阅)
> 接口:银行汇率查询(apiCode=105)· 免费 · 请求方式:POST/GET(同步)· 返回格式:JSON · 适用人群:中高级开发者 / 架构师 · 阅读时间:约 6 分钟
## TL;DR
- 该接口是**纯同步请求-响应**模型:无订阅推送、无回调、无批量查询接入点。
- 高并发靠「连接池 + 客户端限流 + 本地缓存」削峰,不要等不存在的回调。
- 免费档位限制下,限流与缓存比堆并发更重要。
## Why
当你要给汇率看板、行情轮询、跨币种换算服务做并发支撑时,必须先认清接口模型:它不支持异步订阅,所有数据都得你主动发起同步请求去拿。于是高并发的瓶颈不在「等回调」,而在「控制发出去的请求量」。本篇讲清楚在纯同步 + 免费档位下怎么稳妥撑量。
## What
| 项目 | 说明 |
|------|------|
| 调用模型 | 同步 POST/GET 请求-响应 |
| 异步能力 | 无订阅、无回调、无批量接入点 |
| 限流手段 | 客户端令牌桶 / 信号量 + 本地缓存 |
| 关键约束 | 免费接口设使用档次限制,超量会被限流 |
## How
### 步骤:用信号量 + 缓存做受控并发(Python)
```python
import asyncio, time, requests
SEM = asyncio.Semaphore(5) # 同时最多 5 个向外请求
_cache = {}
async def rate(code):
if code in _cache and time.time() - _cache[code][0] < 45:
return _cache[code][1]
async with SEM:
loop = asyncio.get_event_loop()
js = await loop.run_in_executor(None, lambda: requests.post(
"https://route.showapi.com/105-30",
params={"appKey": "YOUR_APPKEY"}, data={"code": code}, timeout=10).json())
if js.get("showapi_res_code") == 0 and js["showapi_res_body"].get("ret_code") == 0:
_cache[code] = (time.time(), js["showapi_res_body"]["list"])
return js["showapi_res_body"]["list"]
return None
# 批量货币并发查,但受信号量约束不会瞬间打满
codes = ["USD","EUR","GBP","JPY","HKD"]
results = await asyncio.gather(*[rate(c) for c in codes])
```
### 要点
- **信号量/令牌桶**:把对外并发压在档次限制以内,宁可排队也别触发限流。
- **缓存优先**:命中缓存直接返回,根本不占额度。
- **超时与退避**:设合理超时(默认 10s),失败用指数退避重试,避免雪崩式重试放大流量。
## 返回示例与解析
返回结构与[字段全解](https://www.showapi.com/guides/exchange-rate-fields-105)一致。并发场景下务必先判 `showapi_res_code` 与 `ret_code`,再处理 `list`。
## 进阶 / 边界
- **没有回调模型**:不要设计「提交任务→等回调」的流程,本接口只给同步响应。
- **不要无限重试**:限流/失败时用退避,连续失败应降级到缓存或静态兜底。
- 多实例部署时,限流与缓存需共享(如 Redis),否则各自发请求仍会触顶。
## FAQ
**Q:接口支持批量查询或订阅推送吗?**
不支持。文档中的四个接入点都是同步请求-响应,无批量、无订阅、无回调。需要批量请自行循环调用并加限流。
**Q:并发很高会怎样?**
免费接口设使用档次限制,超出会被限流;建议用信号量 + 缓存把请求量压到必要下限。
**Q:能用 WebSocket 接收实时推送吗?**
不能,接口未提供推送通道。实时性只能靠你主动轮询 + 本地缓存实现。
## 相关能力 / 下一步阅读
- [银行汇率查询:免费档位下如何做本地缓存避免触达使用档次限制?](https://www.showapi.com/guides/exchange-rate-cache-105)
- [银行汇率查询:搭建企业汇率看板——币种列表 + 实时查询 + 历史走势](https://www.showapi.com/guides/exchange-rate-finance-dashboard-105)
- **本系列共 13 篇**:查看[银行汇率查询指南总目录](https://www.showapi.com/guides/exchange-rate-guides-105)