【异常】elasticsearch的RestClientAPI请求超时问题:java.lang.RuntimeException: error while performing request

本文介绍了解决 Spark 在使用 Elasticsearch RestClientAPI 时遇到的 TimeoutException 问题。通过调整连接超时、Socket 超时及请求超时等参数,有效避免了任务执行过程中的超时错误。

问题描述:

在Spark中使用elasticsearch的RestClient API在读取es中数据时,出现TimeoutException,在之前的优化的中做下面的超时设置,这个只能解决request retries exceeded max retry timeout [30000]这种超时:

RestClient build = RestClient.builder(httpHosts).setMaxRetryTimeoutMillis(5*60*1000).build();


但是在后面的作业启动中还是出现了:java.lang.RuntimeException: error while performing request

java.lang.RuntimeException: error while performing request
        at org.elasticsearch.client.RestClient$SyncResponseListener.get(RestClient.java:681)
        at org.elasticsearch.client.RestClient.performRequest(RestClient.java:219)
        at org.elasticsearch.client.RestClient.performRequest(RestClient.java:191)
        at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:396)
        at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:382)
        at org.elasticsearch.client.RestHighLevelClient.search(RestHighLevelClient.java:323)
        at com.bbd.finance.commons.utils.ESSparkUtils.readBySingleField(ESSparkUtils.java:410)
        at com.bbd.finance.fc.functions.stream.StreamFuncUtils.lambda$null$4(StreamFuncUtils.java:366)
        at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.concurrent.TimeoutException
        at org.apache.http.nio.pool.AbstractNIOConnPool.processPendingRequest(AbstractNIOConnPool.java:364)
        at org.apache.http.nio.pool.AbstractNIOConnPool.processNextPendingRequest(AbstractNIOConnPool.java:344)
        at org.apache.http.nio.pool.AbstractNIOConnPool.release(AbstractNIOConnPool.java:318)
        at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.releaseConnection(PoolingNHttpClientConnectionManager.java:364)
        at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.releaseConnection(AbstractClientExchangeHandler.java:245)
        at org.apache.http.impl.nio.client.MainClientExec.responseCompleted(MainClientExec.java:387)
        at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:172)
        at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:436)
        at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:326)
        at org.apache.http.impl.nio.client.InternalRequestExecutor.inputReady(InternalRequestExecutor.java:83)
        at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265)
        at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
        at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
        at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114)
        at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
        at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
        at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
        at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
        at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
        at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)
        ... 1 more
并且这种异常是不定时出现,最后查看了RestClient的初始化(RestClientBuilder)源码发现有几个连接超时和Socket超时设置的非常小,如下:

public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 1000;
public static final int DEFAULT_SOCKET_TIMEOUT_MILLIS = 30000;
public static final int DEFAULT_MAX_RETRY_TIMEOUT_MILLIS = DEFAULT_SOCKET_TIMEOUT_MILLIS;
public static final int DEFAULT_CONNECTION_REQUEST_TIMEOUT_MILLIS = 500;

所以我们将之前的初始化RestClient的代码做了如下的修改:

RestClientBuilder builder = RestClient.builder(httpHosts).setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
            @Override
            public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
                requestConfigBuilder.setConnectTimeout(5000);
                requestConfigBuilder.setSocketTimeout(40000);
                requestConfigBuilder.setConnectionRequestTimeout(1000);
                return requestConfigBuilder;
            }
        }).setMaxRetryTimeoutMillis(5*60*1000);

        RestHighLevelClient client = new RestHighLevelClient(builder.build());

任务工作正常!


[ERROR]-[pool-2-thread-93race]-[2025-10-28 09:37:25.226]-[]-[]-[]-[]-[java.lang.RuntimeException: The analysis ended with 2 errors: [RuntimeException: error while performing request,PreviousErrorsExistException: A previous exception has occurred]]-[] java.util.concurrent.ExecutionException: java.lang.RuntimeException: The analysis ended with 2 errors: [RuntimeException: error while performing request,PreviousErrorsExistException: A previous exception has occurred] at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357) ~[?:1.8.0_342] at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1928) ~[?:1.8.0_342] at com.jd.platform.async.executor.Async.beginWork(Async.java:36) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.executor.Async.beginWork(Async.java:56) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.lc.extension.jdasync.AsyncEngine.execute(AsyncEngine.java:44) ~[jd-async-engine-1.0.7-SNAPSHOT.jar!/:?] at org.datacleaner.extension.engine.QualityEngine.executeAsync(QualityEngine.java:297) ~[DataCleaner-ext-5.8.1-2024-SNAPSHOT.jar!/:?] at com.governance.datacleaner.async.callable.TableCallable.call(TableCallable.java:56) ~[classes!/:?] at com.governance.datacleaner.async.callable.TableCallable.call(TableCallable.java:20) ~[classes!/:?] at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_342] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_342] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_342] at java.lang.Thread.run(Thread.java:750) ~[?:1.8.0_342] Caused by: java.lang.RuntimeException: The analysis ended with 2 errors: [RuntimeException: error while performing request,PreviousErrorsExistException: A previous exception has occurred] at com.governance.datacleaner.async.function.TableSummaryCallbackFunction.apply(TableSummaryCallbackFunction.java:103) ~[classes!/:?] at com.governance.datacleaner.async.function.TableSummaryCallbackFunction.apply(TableSummaryCallbackFunction.java:26) ~[classes!/:?] at com.lc.extension.jdasync.callback.DefaultCallback.result(DefaultCallback.java:40) ~[jd-async-engine-1.0.7-SNAPSHOT.jar!/:?] at com.lc.extension.jdasync.callback.DefaultCallback.result(DefaultCallback.java:15) ~[jd-async-engine-1.0.7-SNAPSHOT.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.fastFail(WorkerWrapper.java:320) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.doDependsOneJob(WorkerWrapper.java:217) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:141) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.beginNext(WorkerWrapper.java:189) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:142) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.beginNext(WorkerWrapper.java:189) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:130) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:152) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.executor.Async.lambda$beginWork$0(Async.java:33) ~[asyncTool-1.3.1-20240321.jar!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1640) ~[?:1.8.0_342] ... 3 more Caused by: org.datacleaner.job.runner.AnalysisJobFailedException: The analysis ended with 2 errors: [RuntimeException: error while performing request,PreviousErrorsExistException: A previous exception has occurred] at org.datacleaner.job.runner.AnalysisResultFutureImpl.getResultMap(AnalysisResultFutureImpl.java:131) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.extension.result.AnalysisResultExecutor.execute(AnalysisResultExecutor.java:34) ~[DataCleaner-ext-5.8.1-2024-SNAPSHOT.jar!/:?] at com.governance.datacleaner.async.function.TableWorkerSegementFunction.apply(TableWorkerSegementFunction.java:52) ~[classes!/:?] at com.governance.datacleaner.async.function.TableWorkerFunction.apply(TableWorkerFunction.java:30) ~[classes!/:?] at com.governance.datacleaner.async.function.TableWorkerFunction.apply(TableWorkerFunction.java:13) ~[classes!/:?] at com.lc.extension.jdasync.worker.DefaultWorker.action(DefaultWorker.java:36) ~[jd-async-engine-1.0.7-SNAPSHOT.jar!/:?] at com.lc.extension.jdasync.worker.DefaultWorker.action(DefaultWorker.java:15) ~[jd-async-engine-1.0.7-SNAPSHOT.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.workerDoJob(WorkerWrapper.java:341) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.fire(WorkerWrapper.java:299) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.doDependsOneJob(WorkerWrapper.java:220) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:141) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.beginNext(WorkerWrapper.java:189) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:130) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:152) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.executor.Async.lambda$beginWork$0(Async.java:33) ~[asyncTool-1.3.1-20240321.jar!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1640) ~[?:1.8.0_342] ... 3 more Caused by: java.lang.RuntimeException: error while performing request at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:859) ~[elasticsearch-rest-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestClient.performRequest(RestClient.java:259) ~[elasticsearch-rest-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestClient.performRequest(RestClient.java:246) ~[elasticsearch-rest-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1613) ~[elasticsearch-rest-high-level-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1583) ~[elasticsearch-rest-high-level-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1553) ~[elasticsearch-rest-high-level-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestHighLevelClient.bulk(RestHighLevelClient.java:533) ~[elasticsearch-rest-high-level-client-7.9.3.jar!/:7.9.3] at org.datacleaner.extension.writer.CommonInsertIntoElasticSearchWriter.run(CommonInsertIntoElasticSearchWriter.java:297) ~[DataCleaner-ext-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.extension.writer.CommonInsertIntoElasticSearchWriter.run(CommonInsertIntoElasticSearchWriter.java:82) ~[DataCleaner-ext-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.util.WriteBuffer.flushBuffer(WriteBuffer.java:88) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.util.WriteBuffer.addToBuffer(WriteBuffer.java:60) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.extension.writer.CommonInsertIntoElasticSearchWriter.run(CommonInsertIntoElasticSearchWriter.java:269) ~[DataCleaner-ext-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AnalyzerConsumer.consumeInternal(AnalyzerConsumer.java:72) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AbstractRowProcessingConsumer.consume(AbstractRowProcessingConsumer.java:161) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:64) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:72) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.TransformerConsumer.consumeInternal(TransformerConsumer.java:113) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AbstractRowProcessingConsumer.consume(AbstractRowProcessingConsumer.java:161) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:64) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:72) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.FilterConsumer.consumeInternal(FilterConsumer.java:80) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AbstractRowProcessingConsumer.consume(AbstractRowProcessingConsumer.java:161) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:64) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.FilterConsumer.consumeInternal(FilterConsumer.java:80) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AbstractRowProcessingConsumer.consume(AbstractRowProcessingConsumer.java:161) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:64) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.FilterConsumer.consumeInternal(FilterConsumer.java:80) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AbstractRowProcessingConsumer.consume(AbstractRowProcessingConsumer.java:161) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:64) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandler.consumeRow(ConsumeRowHandler.java:145) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.tasks.ConsumeRowTask.execute(ConsumeRowTask.java:51) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.concurrent.TaskRunnable.run(TaskRunnable.java:61) ~[DataCleaner-api-5.8.1-2024-SNAPSHOT.jar!/:?] ... 3 more Caused by: java.util.concurrent.TimeoutException: Connection lease request time out at org.apache.http.nio.pool.AbstractNIOConnPool.processPendingRequest(AbstractNIOConnPool.java:411) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.nio.pool.AbstractNIOConnPool.processNextPendingRequest(AbstractNIOConnPool.java:391) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.nio.pool.AbstractNIOConnPool.release(AbstractNIOConnPool.java:355) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.releaseConnection(PoolingNHttpClientConnectionManager.java:391) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.releaseConnection(AbstractClientExchangeHandler.java:245) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.impl.nio.client.MainClientExec.responseCompleted(MainClientExec.java:387) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:172) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:448) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:338) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591) ~[httpcore-nio-4.4.14.jar!/:4.4.14] ... 1 more
最新发布
10-29
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值