微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring 应用 300 TPS 瓶颈

如何解决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 information */
        invoice.setExternalId(request.getId());
        invoice.setInvoiceType(invoiceType);
        invoice.setInvoiceMethod(new Sorter(SortersConstants.IM_VIRTUAL));
        invoice.setTotalAnticipatedPayment(BigDecimal.ZERO);

        /* Basic information */
        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 information */
//        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 information */
        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 举报,一经查实,本站将立刻删除。