Tanpa penggunaan kembali koneksi, setiap panggilan API membuka koneksi TCP baru dan menjalankan proses jabat tangan TLS, yang menambah latensi. Dalam skenario konkurensi tinggi, overhead ini dapat menyebabkan timeout dan pemborosan sumber daya. Penggunaan kembali koneksi menghilangkan penyiapan berulang, sehingga mengurangi latensi dan konsumsi sumber daya.
DashScope SDK mendukung penggunaan kembali koneksi baik di Java maupun Python:
- Java SDK: Kolam koneksi bawaan diaktifkan secara default. Konfigurasikan parameter seperti jumlah koneksi maksimum dan durasi timeout.
- Python SDK: Aktifkan penggunaan kembali koneksi dengan meneruskan Session kustom. SDK ini mendukung panggilan sinkron maupun asinkron.
Sebelum memulai
Sebelum menjalankan contoh kode berikut:
Java SDK
Java SDK menyertakan kolam koneksi bawaan yang diaktifkan secara default. Sesuaikan jumlah koneksi maksimum dan pengaturan timeout untuk mengoptimalkan sesuai beban kerja Anda.
Parameter
| Parameter | Description | Default value | Unit |
|---|---|---|---|
| connectTimeout | Timeout pembentukan koneksi. | 120 | seconds |
| readTimeout | Timeout pembacaan data. | 300 | seconds |
| writeTimeout | Timeout penulisan data. | 60 | seconds |
| connectionIdleTimeout | Timeout koneksi idle dalam kolam. | 300 | seconds |
| connectionPoolSize | Jumlah koneksi maksimum dalam kolam. | 32 | connections |
| maximumAsyncRequests | Jumlah maksimum permintaan konkuren di semua host (batas global). | 32 | requests |
| maximumAsyncRequestsPerHost | Jumlah maksimum permintaan konkuren per host. | 32 | requests |
maximumAsyncRequestsharus ≤connectionPoolSize; jika tidak, permintaan dapat hang.maximumAsyncRequestsPerHostharus ≤maximumAsyncRequests.
- connectTimeout: Dalam skenario latensi rendah, atur timeout lebih pendek untuk mengurangi waktu tunggu.
- connectionIdleTimeout: Dalam skenario konkurensi tinggi, perpanjang timeout idle untuk menghindari pembuatan koneksi berulang dan mengurangi penggunaan sumber daya.
- connectionPoolSize: Dalam skenario konkurensi tinggi, jumlah koneksi yang terlalu sedikit menyebabkan blocking, timeout, dan koneksi ulang berulang (penggunaan sumber daya lebih tinggi). Sebaliknya, jumlah koneksi yang terlalu banyak membebani server. Seimbangkan jumlah koneksi berdasarkan beban kerja Anda.
Contoh kode
Contoh berikut mengonfigurasi parameter kolam koneksi (timeout, jumlah koneksi maksimum) dan memanggil layanan model. Sesuaikan parameter tersebut untuk mengoptimalkan konkurensi dan penggunaan sumber daya.
// Disarankan versi DashScope SDK >= 2.12.0
import java.time.Duration;
import java.util.Arrays;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.protocol.ConnectionConfigurations;
import com.alibaba.dashscope.protocol.Protocol;
import com.alibaba.dashscope.utils.Constants;
public class Main {
public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException {
// Ini adalah URL wilayah Singapura. Ganti WorkspaceId dengan ID ruang kerja aktual Anda. URL berbeda tiap wilayah.
Generation gen = new Generation(Protocol.HTTP.getValue(), "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1");
Message systemMsg = Message.builder()
.role(Role.SYSTEM.getValue())
.content("You are a helpful assistant.")
.build();
Message userMsg = Message.builder()
.role(Role.USER.getValue())
.content("Who are you?")
.build();
GenerationParam param = GenerationParam.builder()
// Kunci API untuk wilayah Singapura dan Beijing berbeda. Dapatkan kunci API: https://www.alibabacloud.com/help/en/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
// Contoh ini menggunakan qwen-plus. Ubah nama model sesuai kebutuhan. Daftar model: https://www.alibabacloud.com/help/en/model-studio/getting-started/models
.model("qwen-plus")
.messages(Arrays.asList(systemMsg, userMsg))
.resultFormat(GenerationParam.ResultFormat.MESSAGE)
.build();
System.out.println(userMsg.getContent());
return gen.call(param);
}
public static void main(String[] args) {
// Konfigurasi kolam koneksi
Constants.connectionConfigurations = ConnectionConfigurations.builder()
.connectTimeout(Duration.ofSeconds(10)) // Timeout untuk membentuk koneksi, default 120s
.readTimeout(Duration.ofSeconds(300)) // Timeout untuk membaca data, default 300s
.writeTimeout(Duration.ofSeconds(60)) // Timeout untuk menulis data, default 60s
.connectionIdleTimeout(Duration.ofSeconds(300)) // Timeout untuk koneksi idle dalam kolam koneksi, default 300s
.connectionPoolSize(256) // Jumlah koneksi maksimum dalam kolam koneksi, default 32
.maximumAsyncRequests(256) // Jumlah maksimum permintaan konkuren, default 32
.maximumAsyncRequestsPerHost(256) // Jumlah maksimum permintaan konkuren per host, default 32
.build();
try {
GenerationResult result = callWithMessage();
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent());
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
// Gunakan framework logging untuk mencatat informasi exception
System.err.println("Terjadi kesalahan saat memanggil layanan generasi: " + e.getMessage());
}
System.exit(0);
}
}
Python SDK
Python SDK mendukung penggunaan kembali koneksi dengan meneruskan Session kustom. SDK ini mendukung dua metode pemanggilan: HTTP asinkron (berbasis korutin) dan HTTP sinkron.
HTTP Asinkron
Untuk skenario asinkron, gunakan aiohttp.ClientSession dengan aiohttp.TCPConnector untuk mengaktifkan penggunaan kembali koneksi. TCPConnector mendukung konfigurasi parameter seperti batas koneksi:
| Parameter | Description | Default value | Notes |
|---|---|---|---|
| limit | Batas total koneksi (semua host). | 100 | Dalam skenario konkurensi tinggi, tingkatkan nilai ini untuk meningkatkan konkurensi. |
| limit_per_host | Batas koneksi per host. | 0 (tidak terbatas) | Mencegah beban berlebih pada satu host. |
| ssl | Konfigurasi konteks SSL. | None | Validasi sertifikat SSL untuk HTTPS. |
Contoh kode
Contoh berikut mengonfigurasi penggunaan kembali koneksi dan memanggil layanan model secara asinkron:
import asyncio
import aiohttp
import ssl
import certifi
from dashscope import AioGeneration
import dashscope
import os
async def main():
# Ini adalah URL wilayah Singapura. Ganti WorkspaceId dengan ID ruang kerja aktual Anda. URL berbeda tiap wilayah.
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
# Kunci API untuk wilayah Singapura dan Beijing berbeda. Dapatkan kunci API: https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
# Konfigurasi parameter koneksi
connector = aiohttp.TCPConnector(
limit=100, # Batas total koneksi
limit_per_host=30, # Batas koneksi per host
ssl=ssl.create_default_context(cafile=certifi.where()),
)
# Buat Session kustom dan teruskan ke metode panggilan
async with aiohttp.ClientSession(connector=connector) as session:
response = await AioGeneration.call(
model='qwen-plus',
prompt='Hello, please introduce yourself',
session=session, # Teruskan Session kustom
)
print(response)
asyncio.run(main())
HTTP Sinkron
Untuk skenario sinkron, gunakan requests.Session untuk mengaktifkan penggunaan kembali koneksi. Beberapa permintaan dalam Session yang sama menggunakan kembali koneksi TCP dasar, sehingga menghindari overhead pembentukan koneksi berulang.
Contoh kode: panggilan tunggal
Contoh berikut mengonfigurasi penggunaan kembali koneksi dan memanggil layanan model secara sinkron:
import requests
from dashscope import Generation
import dashscope
import os
# Ini adalah URL wilayah Singapura. Ganti WorkspaceId dengan ID ruang kerja aktual Anda. URL berbeda tiap wilayah.
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
# Kunci API untuk wilayah Singapura dan Beijing berbeda. Dapatkan kunci API: https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
# Gunakan pernyataan with untuk memastikan Session ditutup dengan benar
with requests.Session() as session:
response = Generation.call(
model='qwen-plus',
prompt='Hello',
session=session # Teruskan Session kustom
)
print(response)
Contoh kode: beberapa panggilan dengan Session bersama
Untuk menggunakan kembali Session di beberapa panggilan:
import requests
from dashscope import Generation
import dashscope
import os
# Ini adalah URL wilayah Singapura. Ganti WorkspaceId dengan ID ruang kerja aktual Anda. URL berbeda tiap wilayah.
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
# Kunci API untuk wilayah Singapura dan Beijing berbeda. Dapatkan kunci API: https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
# Buat objek Session
session = requests.Session()
try:
# Gunakan kembali Session yang sama untuk beberapa panggilan
response1 = Generation.call(
model='qwen-plus',
prompt='Hello',
session=session
)
print(response1)
response2 = Generation.call(
model='qwen-plus',
prompt='Introduce yourself',
session=session
)
print(response2)
finally:
# Pastikan Session ditutup dengan benar
session.close()
Praktik terbaik
- Java SDK: Atur
connectionPoolSizedanmaximumAsyncRequestssesuai beban kerja Anda. Seimbangkan jumlah koneksi: terlalu sedikit menyebabkan blocking, terlalu banyak membebani server. - Python SDK: Gunakan pernyataan
withuntuk mengelola siklus hidup Session dan memastikan pembersihan sumber daya yang tepat. - Pilih metode yang tepat: Gunakan panggilan asinkron untuk aplikasi asinkron (asyncio, FastAPI). Gunakan panggilan sinkron untuk aplikasi sinkron tradisional.
Kode error
Jika pemanggilan model gagal, lihat Pesan error untuk menyelesaikan masalah.