Spring 应用 300 TPS 瓶颈

问题描述

我有一个在 Spring 上运行的 Java 应用程序,它有一个创建发票的服务,每个发票有 10 次读取和写入。但是我们无法让它通过 150TPS(每秒事务数),硬件没有达到 30% 的容量,我们将 maxpool 大小设置为 300,DB 设置为 3000 I/O,我们没有看到任何改进,我不确定它的代码或配置

AWS DB Monitor

public class InvoiceHomeService {

    private final Logger log = LoggerFactory.getLogger(InvoiceHomeService.class);

    private final DosageService dosageService;

    private final DosageRepository dosageRepository;

    private final InvoiceService invoiceService;

    private final ApplicationProperties applicationProperties;

    public Invoice create(Company company,CreateInvoiceHomeRequest request,Branch branch,EconomicActivity economicActivity,String modalityId) throws DosageNotAvailableException,DateOutRangeException {

        Sorter invoiceType = new Sorter(SortersConstants.HOME);
        DosageTransaction dosageTransaction = getDosageTransaction(request,company,economicActivity,invoiceType,modalityId);

        Invoice invoice = new Invoice();

        /* Critital @R_751_4045@ion */
        invoice.setExternalId(request.getId());
        invoice.setInvoiceType(invoiceType);
        invoice.setInvoiceMethod(new Sorter(SortersConstants.IM_VIRTUAL));
        invoice.setTotalAnticipatedPayment(BigDecimal.ZERO);

        /* Basic @R_751_4045@ion */
        invoice.setContractId(request.getContractId());
//        invoice.setCustomerId(request.getCustomerId());
        invoice.setBillingPeriod(request.getBillingPeriod());
        invoice.setVoucherNumber(request.getVoucherNumber());
        invoice.setVoucherType(request.getVoucherType());
//        invoice.setVoucherSerial(request.getVoucherSerial());
        invoice.setVoucherState(request.getVoucherState());
        invoice.setPaymentType(request.getTypeOfPayment());
        invoice.setEmailNotification(request.getEmailNotification());
        invoice.setPhoneNumberNotification(request.getPhoneNumberNotification());
        invoice.setIsTigo(request.getIsTigo());
        invoice.setPersonType(request.getTypeOfPerson());

        /* Extras @R_751_4045@ion */
//        invoice.setExtraPhoneLine(request.getExtraPhoneLine());
//        invoice.setExtraPlan(request.getExtraPlan());
        invoice.setExtraCustomerAddress(request.getExtraCustomerAddress());
        invoice.setExtraPeriodStartdate(request.getExtraPeriodStartdate());
        invoice.setExtraPeriodEnddate(request.getExtraPeriodEnddate());
        invoice.setExtraPaydayLimit(request.getExtraPaymentDeadline());
        invoice.setExtraServiceInterruptionDate(request.getExtraServiceInterruptionDate());
        invoice.setExtraPeriodDays(request.getExtraPeriodDays());

        /* Customer @R_751_4045@ion */
        invoice.setNitCustomer(request.getNitCustomer());
        invoice.setSocialReason(request.getSocialReason());

        /* Invoice template */
        invoice.setInvoiceTemplate(JasperSingleton.INVOICE_TEMPLATE_HOME_VERSION);

        Set<InvoiceDetails> details = new HashSet<>();
        for (CreateInvoiceDetailsHomeRequest detail : request.getDetails()) {
            InvoiceDetails item = new InvoiceDetails();
            item.setQuantity(detail.getQuantity());
            item.setConcept(detail.getConcept());
            item.setUnitPrice(detail.getUnitPrice());
            item.setSequence(detail.getSequence());
            item.setSubtotal(detail.getSubtotal());
            item.setExtraPeriod(detail.getExtraPeriod());
            details.add(item);
        }
        invoice.setDetails(details);

        invoice = invoiceService.createInvoice(
            invoice,dosageTransaction.getDosage(),branch,dosageTransaction.getSequence(),request.getEmissionDate(),request.getTotalAmount(),economicActivity.getType()
        );

        return invoice;
    }

    public synchronized DosageTransaction getDosageTransaction(CreateInvoiceHomeRequest request,Company company,Sorter invoiceType,DateOutRangeException {
        Optional<Dosage> optionalDosage = dosageService.getDosageActive(company.getId(),invoiceType.getSequence(),economicActivity.getId(),SortersConstants.DT_CYCLE,modalityId,invoiceType.getId());
        if (!optionalDosage.isPresent()) throw new DosageNotAvailableException();
        Dosage dosage = optionalDosage.get();

        if (!request.getEmissionDate().isAfter(dosage.getStartDate().minusDays(1)) ||
            !request.getEmissionDate().isBefore(dosage.getDeadlineDate().plusDays(1))) throw new DateOutRangeException();

        if (modalityId.equalsIgnoreCase(SortersConstants.DM_CICLICAL) && dosage.getSequence() > applicationProperties.getDosageConfig().getMaxInvoicePerDosage().longValue()) {
            dosage.setState(new Sorter(SortersConstants.DS_LOCKED));
            dosage = dosageRepository.save(dosage);
            log.info("Change state dosage: {},state: {}",dosage.getId(),dosage.getState().getId());
            return getDosageTransaction(request,modalityId);
        }

        Long sequence = invoiceService.getSequenceDosageSync(dosage.getId());
        return new DosageTransaction(dosage,sequence);
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)