飞讯管理员端的问卷方面功能

已解决:Field xxxDao in xxxService required a bean of type xxxDao that could not be found 项目场景: 在用springBoot做开发的启动项目的时候出现如下异常: *************************** APPLICATION FAILED TO START *************************** Description: Field commentDao in com.sse.house.biz.service.CommentService required a bean of type 'com.sse.house.biz.dao.CommentDao' t 阅读详情

数据库方面设计

        问卷主体表:

varchar questionnaireId 自增主键,问卷的唯一标识

varchar userid  发布问卷的用户

varchar name 问卷名称

varchar createTime 问卷创建时间

varchar startTime 问卷开始时间

varchar endTime 问卷结束时间

varchar state 问卷状态,分为暂存,发布,删除三种状态

int count 问卷被完成的次数

问题表

varchar questionId 自增主键,问题的唯一标识

varchar questionnaireId 问题所属问卷

varchar type 问题类型,分为单选(Radio)多选(Checkbox)主观(Input)

varchar flag 问题选择类型,分为必选和可选

varchar text 问题文本

选项表

varchar optionId 自增Id,选项唯一标识

varchar questionId 选项所属问题

varchar questionnaireId 选项所属问卷

varchar text 选项文本

回答表

varchar answerInfoId 自增主键,回答唯一标识

varchar questionId 回答所属问题

varchar questionnaireId 回答所属问卷

varchar createTime 回答时间

varchar content 回答内容

int count 第几个回答问卷的人

分别为问卷,问题,选项设置dao

QuestionnaireDao
package dao;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import entity.Questionnaire;

public class QuestionnaireDao {
    public List<Questionnaire> getQuestionnaireList(){
        Connection con=null;
        try{
            con=DBConnection.getConnection();
            String sql="select * from questionaire\n" +
                    "";
            PreparedStatement pst=con.prepareStatement(sql);
            List<Questionnaire> questionnaires=new ArrayList<Questionnaire>();
            ResultSet rs=pst.executeQuery();

            while(rs.next())
            {
                Questionnaire questionnaire=new Questionnaire();

                questionnaire.setQuestionnaireId(rs.getString("questionnaireId"));

                questionnaire.setOperator_Account(rs.getString("userid"));
                questionnaire.setName(rs.getString("name"));
                questionnaire.setCreateTime(rs.getString("createTime"));
                questionnaire.setStartTime(rs.getString("startTime"));
                questionnaire.setEndTime(rs.getString("endTime"));
                questionnaire.setState(rs.getString("state"));

                questionnaires.add(questionnaire);

            }
            return questionnaires;
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }finally{
            DBConnection.closeConnection(con);
        }

    }
    public Questionnaire getQuestionnaireById(String QuestionnaireId){
        Connection con=null;
        try{
            con=DBConnection.getConnection();
            String sql="select * from questionaire\n" +
                    "where  questionnaireId=\'"+QuestionnaireId+"\'";
            PreparedStatement pst=con.prepareStatement(sql);

            ResultSet rs=pst.executeQuery();
            Questionnaire questionnaire=new Questionnaire();
            while(rs.next())
            {
                QuestionDao questionDao=new QuestionDao();

                questionnaire.setQuestionnaireId(rs.getString("questionnaireId"));

                questionnaire.setOperator_Account(rs.getString("userid"));
                questionnaire.setName(rs.getString("name"));
                questionnaire.setCreateTime(rs.getString("createTime"));
                questionnaire.setStartTime(rs.getString("startTime"));
                questionnaire.setEndTime(rs.getString("endTime"));
                questionnaire.setState(rs.getString("state"));
                questionnaire.setQuestions(questionDao.QuestionByQuestionnaireId(QuestionnaireId));

            }
            return questionnaire;
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }finally{
            DBConnection.closeConnection(con);
        }

    }
    public List<Map<String, Integer>> getAnswerNumberByQuestionnaireId(String QuestionnaireId){
        Connection con=null;
        con=DBConnection.getConnection();

        try {
            String sql="select *,count(*) nums from answerinfo where questionnaireId=\'"+QuestionnaireId+"\'\n" +
                    "and questionId not in (select question.questionId from question where question.type='Input' and question.questionnaireId=\'"+QuestionnaireId+"\')\n" +
                    "                group by questionId,content\n" +
                    "                order by questionId";
            PreparedStatement pst= null;
            pst = con.prepareStatement(sql);
            Questionnaire questionnaire=this.getQuestionnaireById(QuestionnaireId);
            List<Map<String,Integer>> maps=new ArrayList<Map<String,Integer>>();
            for(int i=1;i<=questionnaire.getQuestions().size();i++){
                maps.add(new HashMap<String,Integer>());
            }
            ResultSet rs=pst.executeQuery();

            while(rs.next()){

                for(int i=1;i<=questionnaire.getQuestions().size();i++){
                    Map<String,Integer> map = new HashMap<String,Integer>();
                    String s=rs.getString("questionId");
                    while(rs.getString("questionId").equals(s)){
                        maps.get(i-1).put(rs.getString("content"),rs.getInt("nums"));
                        if(!rs.isLast()) {
                            rs.next();
                        }else {break;}

                    }

                }
            }
            return  maps;
        } catch (SQLException e) {
            e.printStackTrace();
        }
            return null;
    }
    public int[] getQuestionnaireNUms(){
        Connection c=null;
        try {
            c=DBConnection.getConnection();
            PreparedStatement ps = null;
            String sql = "select * ,count(*) num from questionaire\n" +
                    "    " +
                    "group by state\n" +
                    "" +
                    "" +
                    "\n";
            ps = c.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            int[] nums= new int[2];//0-published,1-saved,2-destroyed

            for(int i=0;rs.next();i++) {
            nums[i]=rs.getInt("num");
            }


            return nums;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBConnection.closeConnection(c);
        }
        return null;
    }


}

QuestionDao

package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.sql.Timestamp;

import entity.Question;
import entity.Option;
public class QuestionDao {
    public List<Question> QuestionByQuestionnaireId(String QuestionnaireId){
        Connection con=null;
        try{
            con=DBConnection.getConnection();
            String sql="select * from question\n" +
                    "where questionnaireId=\'"+QuestionnaireId+"\' ";
            PreparedStatement pst=con.prepareStatement(sql);
            List<Question> questions=new ArrayList<Question>();
            ResultSet rs=pst.executeQuery();

            while(rs.next())
            {
               Question question=new Question();
               OptionDao optionDao=new OptionDao();

               question.setQuestionId(rs.getInt("questionId"));
               question.setQuestionnaireId(rs.getString("questionnaireId"));
               question.setType(rs.getString("type"));
               question.setFlag(rs.getString("flag"));
               question.setText(rs.getString("text"));
               question.setOptions(optionDao.OptionByQuestionnaireIdAndQuestionId(QuestionnaireId,rs.getString("questionId")));
               questions.add(question);

            }
            return questions;
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }finally{
            DBConnection.closeConnection(con);
        }

    }
    public int[] getQuestionNums(){
        Connection c=null;
        try {
            c=DBConnection.getConnection();
            PreparedStatement ps = null;
            String sql = "select * ,count(*) num from question\n" +
                    "    " +
                    "group by type";
            ps = c.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            int[] nums= {0,0,0};//0-Radio,1-Checkbox,2-Input

            for(int i=0;rs.next();i++) {
                nums[i]=rs.getInt("num");
            }


            return nums;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBConnection.closeConnection(c);
        }
        return null;
    }
    public int getAnswerNums(){
        Connection c=null;
        try {
            c=DBConnection.getConnection();
            PreparedStatement ps = null;
            String sql = "select * from questionaire";
            ps = c.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            int nums=0;

            while (rs.next()){

                nums+=rs.getInt("count");
            }


            return nums;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBConnection.closeConnection(c);
        }
        return 0;
    }
}

OptionDao

package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import entity.Option;
public class OptionDao {
    public List<Option> OptionByQuestionnaireIdAndQuestionId(String QuestionnaireId,String QuestionId){

        Connection con=null;
        try{
            con=DBConnection.getConnection();
            String sql="select * from optionselect\n" +
                    "where questionnaireId=\'"+QuestionnaireId+"\' and questionId=\'"+QuestionId+"\'";
            PreparedStatement pst=con.prepareStatement(sql);
            List<Option> options=new ArrayList<Option>();
            ResultSet rs=pst.executeQuery();
           while(rs.next()) {
               Option option = new Option();

               option.setQuestionnaireId(rs.getString("questionnaireId"));
               option.setQuestionId(rs.getInt("questionId"));
               option.setOptionId(rs.getString("optionId"));
               option.setText(rs.getString("text"));
               options.add(option);
           }

            return options;
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }finally{
            DBConnection.closeConnection(con);
        }
    }
}

servlet部分设计

首先需要向前端发送所有的问卷信息,将问卷封装成对象,再将每个对象放到一个LIstanbul中

List<Questionnaire> questionnaireList=dao.getQuestionnaireList();

前端使用表格承载

<fieldset class="table-search-fieldset" style="color: #009688">
                <legend>搜索信息</legend>
                <div style="margin: 10px 10px 10px 10px" id="btn">
                    <form class="layui-form layui-form-pane" action="">
                        <div class="layui-form-item">
                            <div class="layui-inline">
                                <label class="layui-form-label">搜索内容</label>
                                <div class="layui-input-inline">
                                    <!--注意此处input标签里的id-->
                                    <input class="layui-input" name="keyword" id="demoReload" autocomplete="off">
                                </div>
                            </div>

                            <div class="layui-inline">
                                <!--注意此处button标签里的type属性-->
                                <button type="button" onclick="find()" class="layui-btn layui-btn-primary"  lay-submit data-type="reload" lay-filter="data-search-btn" style="color:#428bca"><i class="layui-icon"></i> 搜 索</button>
                                <input type="radio" name="type" value="questionnaireId" title="问卷Id" checked>
                                <input type="radio" name="type" value="operator_Account" title="操作者" >
                                <input type="radio" name="type" value="name" title="问卷名" >

                            </div>
                        </div>
                    </form>
                </div>
            </fieldset>
            <table class="result-tab" width="100%" lay-filter="demo">
                <thead>
                <tr align="left" >
                    <!-- <th class="tc" width="5%"><input class="allChoose" name="" type="checkbox"></th>
                    <th>排序</th> -->

                    <th lay-data="{field:'questionnaireId', width:100}">问卷Id</th>

                    <th lay-data="{field:'operator_Account', width:100}">操作者ID</th>
                    <th lay-data="{field:'name', width:150}">问卷名称</th>
                    <th lay-data="{field:'createTime', width:200}">创建时间</th>
                    <th lay-data="{field:'startTime', width:200}">开始时间</th>
                    <th lay-data="{field:'endTime', width:200}">结束时间</th>
                    <th lay-data="{field:'state', width:100}">状态</th>
                    <th lay-data="{field:'check', width:100}">查看</th>
                </tr>
                </thead>

                <c:forEach items="${questionnairelist}" var="questionnaire">
                    <tr>


                        <td>${questionnaire.questionnaireId}</td>

                        <td>${questionnaire.operator_Account}</td>
                        <td>${questionnaire.name}</td>
                        <td>${questionnaire.createTime}</td>
                        <td>${questionnaire.startTime}</td>
                        <td>${questionnaire.endTime}</td>
                        <td>${questionnaire.state}</td>
                        <td id="${questionnaire.questionnaireId}"></td>
                        <script type="text/javascript">

                            var url="${questionnaire.questionnaireId}";
                            var res=encodeURIComponent(url);
                            console.log(res);
                            document.getElementById("${questionnaire.questionnaireId}").innerHTML="<a href=/QuestionnaireDetail?questionnaireId="+res+">查看</a>"

                        </script>
                    </tr>


                    </tr>
                </c:forEach>
            </table>
            <script>
                var table = layui.table;

                //转换静态表格
                table.init('demo', {
                    height: 450 //设置高度
                    ,limit: 10 //注意:请务必确保 limit 参数(默认:10)是与你服务端限定的数据条数一致
                    ,page:true
                });
            </script>

查看问卷详情的时候,需要对问卷的每一个问题实体化,封装成一个个问题传送到前端

questions=questionDao.QuestionByQuestionnaireId(QuestionnaireId);

将客观题存储到map中,并且将map变为前端可以识别的字符串

String datas[]=new String[maps.size()];
        for(int i=0;i<maps.size();i++){
            datas[i]="";
            for(String key: maps.get(i).keySet()){
                datas[i]+="[\""+key+"\","+maps.get(i).get(key)+"],";
            }
            System.out.println(datas[i]);
        }

前端实现

<div class="result-wrap">
            <nobr style="margin-left: 50px ;font-size: 20px">共有${selectNum+inputNum}道题,其中选择${selectNum}道,主观${inputNum}道</nobr>
            <nobr style="margin-left: 50px;font-size: 10px;color: #808080">${mandatoryNum}道必选题</nobr>
            <div class="layui-col-md8">
                <c:forEach items="${questions}" var="question" varStatus="id" >
                <div id="${id.count}" style="display:none; height: 200px">
                    <div class="layui-panel">
                        <div style="padding: 30px;">
                            <c:if test="${question.getFlag()=='Mandatory'}"><nobr style="color: #ff0000">*</nobr></c:if>
                            <nobr style="color: #009688;font-size: 20px">${question.getText()}</nobr>
                            <nobr style="color: #3F3F3F;">
                                <c:if test="${question.getType()=='Radio'}">(单选)</c:if>
                                <c:if test="${question.getType()=='Checkbox'}">(多选)</c:if>
                                <c:if test="${question.getType()=='Input'}">(主观)

                                </c:if>
                                <c:if test="${question.getType()=='Input'}">
                                    <button type="button" class="layui-btn layui-btn-sm layui-btn-normal" style="float: right" onclick="detail()">
                                    查看详情<i class="layui-icon layui-icon-right"></i>
                                </button>
                                    <script>
                                        function deatil(){
                                            window.location.href ="/QuestionDetail?questionId="+"${question.getQuestionId()}";
                                        }
                                    </script>

                                </c:if>


                            </nobr>
                            <br/>
                            <c:forEach items="${question.getOptions()}" var="options" varStatus="id2">
                                <i class="layui-icon ">&#xe63f;</i><nobr>${options.getText()}</nobr>
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            </c:forEach>
                        </div>

                   </div>
                </div>
                </c:forEach>


                </div>
            <div class="layui-col-md4"  style="height: 200px;width: 300px">
                <c:forEach items="${questionmaps}" var="data" varStatus="id" >
                    <div style="height: 200px; display: none;margin: auto" id="${id.count+10}"></div>
                    <c:if test="${data!=''}">
                        <script type="text/javascript">


                            var chart = Highcharts.chart('${id.count+10}', {
                                credits: {
                                    enabled:false,
                                },chart: {
                                    type: 'column'
                                },
                                title: {
                                    text: ''
                                },
                                subtitle: {
                                    text: ''
                                },
                                xAxis: {
                                    type: 'category',
                                    labels: {
                                        rotation: -45  // 设置轴标签旋转角度
                                    }
                                },
                                yAxis: {
                                    min: 0,
                                    title: {
                                        text: '选择人次'
                                    }
                                },
                                legend: {
                                    enabled: false
                                },
                                tooltip: {
                                    pointFormat: '选择人数: <b>{point.y:.0f} 次</b>'
                                },
                                series: [{
                                    name: '',
                                    data: [${data}
                                    ],

                                }]
                            });
                        </script>
                    </c:if>

                </c:forEach>
            </div>


                <script type="text/javascript">

                    var nums = ${inputNum+selectNum};
                    if(nums>3){
                        nums=3;
                    }
                    for(var i=0;i<nums;i++){
                        document.getElementById(nums-i).setAttribute("style", "display:block;height: 200px");
                        document.getElementById(nums+10-i).setAttribute("style", "display:block;height: 200px");
                    }

                </script>
            <div style="clear: both">
                <button type="button" class="layui-btn layui-btn-disabled" onclick="fpre()" id="buttonpre">上一页</button>
                <button type="button" class="layui-btn" onclick="fnext()" id="buttonnext">下一页</button>
                <script type="text/javascript">
                    if(1 == parseInt((total + nums-1) / nums)){document.getElementById("buttonnext").setAttribute("class", "layui-btn layui-btn-disabled");}

                </script>
            </div>



        </div>

采用每一页展示三个题目,可以进行翻页

翻页的js部分

fnext为下一页

fpre为上一页

function fnext() {
            console.log(parseInt((total + nums-1) / nums))
            if (page < parseInt((total + nums-1) / nums)) {
                page++;
                for (var num = (page - 2) * nums + 1; num <= (page - 1) * nums; num++) {


                    document.getElementById((num) + "").setAttribute("style", "display:none;");
                    document.getElementById((num+10) + "").setAttribute("style", "display:none;");

                }
                for (var num = (page - 1) * nums + 1; num <= page * nums; num++) {
                    if (num <= total) {

                        document.getElementById((num) + "").setAttribute("style", "display:block;height: 200px");
                        document.getElementById((num+10) + "").setAttribute("style", "display:block;height: 200px");
                    }

                }

                if (page >= parseInt(total + 1) / nums) {
                    document.getElementById("buttonnext").setAttribute("class", "layui-btn layui-btn-disabled");

                }
                document.getElementById("buttonpre").setAttribute("class", "layui-btn");
            }

        }

        function fpre() {
            if (page > 1) {
                page--;
                for (var num = (page) * nums + 1; num <= (page + 1) * nums; num++) {
                    if (num <= total) {

                        document.getElementById((num) + "").setAttribute("style", "display:none;");
                        document.getElementById((num+10) + "").setAttribute("style", "display:none;");
                    }

                }
                for (var num = (page - 1) * nums + 1; num <= page * nums; num++) {


                    document.getElementById((num) + "").setAttribute("style", "display:block;height: 200px");
                    document.getElementById((num+10) + "").setAttribute("style", "display:block;height: 200px");

                }

                if (page == 1) {
                    document.getElementById("buttonpre").setAttribute("class", "layui-btn layui-btn-disabled");

                }
                document.getElementById("buttonnext").setAttribute("class", "layui-btn");
            }

        }

TDSQL 扩容 2 台 DB 节点实操笔记 本文档详细介绍了在Kylin Linux V10系统下对TDSQL集群进行扩容的操作指南。主要内容包括:1)环境准备要求,确保集群状态正常并完成备份;2)新增DB节点的初始化配置流程,涵盖互信设置、主机名修改、安全策略等;3)通过Ansible自动化安装DB模块;4)赤兔管理台上报新资源步骤;5)扩容后的功能验证方法;6)注意事项及回退方案。该文档适用于数据库管理员和运维人员,强调需在业务低峰期操作并保留7天观察期。全文提供标准化操作命令和关键检查点,确保扩容过程安全可控。 阅读详情

相关推荐

问卷调查数据库管理系统设计与实现

本文还有配套的精品资源,点击获取 简介:在IT行业中,数据库是数据存储和管理的核心,特别是在问卷调查中,一个设计良好的数据库至关重要。本文介绍了一个针对问卷调查设计的数据库系统,包括其关键组成部分如"问卷"、"问题"、"选项"、"受访者"和"回答"等表的结构与功能。详细说明了创建问卷调查数据库所需的SQL脚本,包括表的创建、数据插入、索引建立、视图创建、存储过程和函数的编写...

weixin_42593701的博客 1693

[.NET项目实战] Elsa开源工作流组件应用(三):实战演练

之前的文章简单介绍了工作流和Elsa工作流库,这里再补充说明两点工作流的使用场景非常广泛,几乎涵盖了所有需要进行业务流程自动化管理的领域。学习一个开源库,最简单的方法就是看源码,Elsa的工作流引擎源码非常简单易懂,并且提供了非常丰富的示例代码,举一个例子:审批工作流示例这个审批流是这样的:作者发来一个文章,有两个审批人需要全部审批通过,文章才算通过,否则退回。

jevonsflash的专栏 3139

questionnaire:问卷调查系统

作者实力有限,项目已不再维护 问卷调查系统 可以实现编辑问题,建立题库,发布问卷,统计结果等功能。 安装 环境依赖 Node.js mongoDB 跑 git clone https://github.com/LiangCY/questionnaire.git cd questionnaire npm install node app.js 用户名admin 密码123456 部分截图 问卷页面 统计结果 后台管理 题库 编辑译文 添加问卷

通过调查问卷获取访客的资料

Java文件方法1: @Resource(name="questionnaireService") private QuestionnaireService questionnaireService; @Resource(name="quserInfoRecordService") private QuserInfoRecordService qus

hins 1883

java问卷调查关键点

public List getSurveryQuestion(String surveryQuestionnaireId) { List questions = dborm.getEntities(SurveryQuestion.class, "select * from survery_question where survery_questionnaire_id = ?", surve

幸福的使者 3032

山东大学创新实训进度

进度记录

weixin_54533613的博客 440

Questionnaire

Questionnaire Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 742    Accepted Submission(s): 509 Special Judge Problem Descript

CSDN_YingHui的博客 1036

问卷调查管理系统

问卷调查管理系统拥有两种角色,分别为管理员和用户 管理员:用户的增加和删除、查看问卷结果、管理所有问卷、查看个人发布问卷 用户:查看所有问卷,填写问卷,创建问卷

wangbuerCoder的博客 3438

飞讯管理员端签到部分设计

飞讯签到部分

qq_46025739的博客 381

questionnaire用例测试

项目测试

tyf4350158的博客 470

腾渊科技重磅出品——多Agent协同通信层实战:基于Kafka的设计与代码实现

【摘要】本文针对多Agent协同场景下的通信问题,提出基于Kafka的解决方案。文中以3C产线的调度Agent和质检Agent为例,指出因缺乏协同层导致工单分配错误、不良品流转等典型问题。通过Kafka实现状态广播(工位状态变更)、冲突仲裁(质量优先策略)和事件溯源三大核心功能,并提供关键代码示例(状态发布/订阅、优先级仲裁、心跳检测)。文章特别强调消费者组隔离、消息时间戳、状态持久化等实践要点,最终实现冲突归零、200ms内信息同步的优化效果。该方案适用于需高可靠性、可追溯性的工业级多Agent系统。

df45776的博客 356

kafka broker迁移

可以按 10/20 个 Partition 一批执行,直到旧 Broker 的。

qq_38636133的博客 347

RabbitMQ灵活路由:AMQP协议与五种交换器

本文从Kafka的"按分区粗路由"痛点出发,系统讲解RabbitMQ与AMQP 0-9-1协议核心,给出Docker部署、Java客户端、Spring Boot集成、Publisher Confirm与Consumer ACK、DLX死信队列的完整代码,并总结生产环境消息丢失、重复消费、堆积的避坑经验。

雨1986的博客 586

【Kafka学习4】六大核心 API

本文全面介绍了Kafka的核心API体系,包括Producer API(数据生产)、Consumer API(数据消费)、Share Consumer API(协同消费)、Streams API(流处理)、Connect API(数据管道)和Admin API(集群管理)。文章通过Mermaid流程图展示了各API与Kafka集群的交互关系,并详细阐述了各API的核心原理、典型应用场景及Maven依赖配置。Kafka的API分层设计使其既能作为简单消息队列使用,也能支撑复杂的实时计算场景,开发者可根据需求灵

海兰 256

【Kafka进阶2】Kafka 运维指南-从选型决策、集群部署,到故障排查与成本优化的实战手册

Kafka运维实战指南摘要 Kafka作为现代化数据架构的"中枢神经",其运维复杂度高但回报巨大。本文提供了一份从选型到故障处理的完整指南: 核心要点: 选型标准 - Kafka适合高吞吐、需持久化和多消费者场景,但不适合低流量队列或同步RPC 部署决策 - 自建成本低但运维重,托管服务省心但昂贵;本地部署适合长期存储,云部署弹性更佳 容量规划 - 需精确计算写入吞吐、分区数、存储需求(含复制因子和缓冲)及CPU/内存配置 数据安全 - 通过ISR机制、生产者acks设置、合理保留策略和备份方案构建多层防护

海兰 357

Flink + Kafka 数据写入实战:从API调用到端到端一致性精讲

本文介绍了如何使用Flink将处理后的数据写入Kafka,重点分析了新旧两种API(FlinkKafkaProducer和KafkaSink)的差异,并深入探讨了端到端Exactly-Once语义的实现原理。主要内容包括: 架构演进:对比了新旧API在可靠性、一致性、动态路由等方面的改进,推荐使用Flink 1.13+的新KafkaSink API。 两阶段提交协议:详细解释了Flink如何通过2PC协议与Kafka事务API配合,在Checkpoint机制下实现Exactly-Once语义。 实战代码:提

渣渣盟的博客 300

Kafka 深度解剖 2:消费者组再均衡 Rebalance 全流程

Rebalance 是 Kafka 消费者组最复杂、也最容易引发生产事故的机制。本文从源码层面完整走读 Rebalance 的协议流程(JoinGroup → SyncGroup → Heartbeat),深入解析 Eager 和 Cooperative 两种 Rebalance 协议的差异,揭示 Stop-the-World 问题的根源——为什么一次 Rebalance 能让消费暂停数十秒。包含 Consumer 端状态机、Coordinator 端处理逻辑、Rebalance 触发条件全景图,以及生产环

雨1986的博客 1110
上一篇: 飞讯管理员端群组部分完整版实现
下一篇: 飞讯管理员端签到部分设计
Nine-Theta
博客等级 码龄7年 0粉丝 20原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值